Как выполнить команду условно в docker compose - PullRequest
1 голос
/ 25 октября 2019

Я хочу выполнить команду условно в docker-compose

, потому что когда кто-то запускает это приложение в первый раз,

Они должны запустить команду migrate, чтобы они могли запустить django приложение правильно

Но если их докер запустил migrate, нет необходимости снова запускать migrate

Так что это команда, чтобы проверить, что их докер запустил migrate.

    if [[ -z $(python3 zeus/manage.py showmigrations | grep '\[ \]')]]; then
        echo 'no need to migrate'
    else
        echo 'need to migate'
    fi

Это мой docker-compose.

version: '3'

services:
  db:
    image: postgres
  web:
    command: >
         bash -c "if [[ -z $(python3 zeus/manage.py showmigrations | grep '\[ \]')]]; then
               echo 'no need to migrate'
            else
               echo 'need to migate'
            fi && python3 zeus/manage.py runserver 0.0.0.0:8000
         "

Но ошибка возникает вот так

ERROR: Invalid interpolation format for "build" option in service 
"web": "bash -c "if [[ -z $(python3 zeus/manage.py showmigrations | grep '\[ \]')]]; then 
echo 'no need to migrate' else echo 'need to migate' fi 
&& python3 zeus/manage.py runserver 0.0.0.0:8000""

Есть идеи?

Edit

Это нормально, когда я запускаю скрипт проверки миграции в обычном bash

Я думаю, что docker-compose не может разобрать $(python3 manage.py .....) part.

Ответы [ 2 ]

1 голос
/ 25 октября 2019

попробуйте это:

version: '3'

services:
  db:
    image: postgres
  web:
    command: bash -c "if [[ -z $$(python3 zeus/manage.py showmigrations | grep '\\[ \\]') ]]; then
               echo 'no need to migrate';
            else
               echo 'need to migate';
            fi && python3 zeus/manage.py runserver 0.0.0.0:8000"

там было три проблемы, вам нужно экранировать escape-символ \ и добавить еще $, чтобы избежать замены в compose, и еще один пробел перед последним ]]

0 голосов
/ 25 октября 2019

Старайтесь избегать написания сложных сценариев на docker-compose.yml, особенно если они предназначены для обычных частей настройки вашего приложения.

Типичным примером является установка такого рода настройки в сценарии точки входа. Этот скрипт заканчивается командой оболочки exec "$@". В контексте Docker это говорит ему о необходимости заменить себя командой (из оператора Dockerfile CMD или Docker Compose command:). Для вашего примера это может выглядеть следующим образом:

#!/bin/sh
if [ -z $(python3 zeus/manage.py showmigrations | grep '\[ \]')]; then
    echo 'no need to migrate'
else
    echo 'need to migate'
fi
exec "$@"

Затем скопируйте этот файл в Dockerfile и укажите его как ENTRYPOINT;оставьте ваш CMD, который запускает ваше приложение, без изменений.

COPY entrypoint.sh /app
RUN chmod +x entrypoint.sh
ENTRYPOINT ["/app/entrypoint.sh"]
CMD python3 zeus/manage.py run --host=0.0.0.0:8000

Оператор ENTRYPOINT должен быть формой JSON-массива и не должен иметь явной оболочки sh -c.

Если вы хотите убедиться, что все настроено правильно, вы можете запустить

docker-compose run web sh

, и вы получите оболочку в точке, в которой exec "$@": после выполнения ваших миграций и других настроек,но вместо вашего основного процесса сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...