2015-05-05 4 views

ответ

361

Фигурные его, используйте bash -c.

Пример:

command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000" 

же пример в мультилиний:

command: > 
    bash -c "python manage.py migrate 
    && python manage.py runserver 0.0.0.0:8000" 
+0

не работал для меня. – Pedram

+0

@Pedram вы используете формат докеры-компоновки версии 2? – ecoding5

+1

@ ecoding5 Да, я использую версию 2 – Pedram

14

Еще одна идея:

Если, как в данном случае, вы строите контейнер просто поместить скрипт запуска в нем и запустите это с помощью команды. Или установите сценарий запуска как том.

+0

Да, это тоже работает! –

+0

Да, в конце я создал скрипт run.sh: '' '#!/Bin/bash \ n python manage.py migrate \ n python manage.py runningerver 0.0.0.0: 8000''' (уродливый oneline) – fero

79

Я бег до запуска вещи, как миграции в отдельной эфемерной контейнере, например, так (обратите внимание, составьте файл должен быть версии «2» типа):

db: 
    image: postgres 
web: 
    image: app 
    command: python manage.py runserver 0.0.0.0:8000 
    volumes: 
    - .:/code 
    ports: 
    - "8000:8000" 
    links: 
    - db 
    depends_on: 
    - migration 
migration: 
    build: . 
    image: app 
    command: python manage.py migrate 
    volumes: 
    - .:/code 
    links: 
    - db 
    depends_on: 
    - db 

Это помогает вещам содержать в чистоте и отдельно , Две вещи, чтобы рассмотреть следующие вопросы:

  1. Вы должны обеспечить правильную последовательность запуска (с помощью depends_on)

  2. вы хотите, чтобы избежать многочисленных сборок, которая достигается за счет мечения его в первый раз вокруг с помощью построения и изображения; Вы можете обратиться к изображению в других контейнерах, то

+1

Это кажется лучшим вариантом для меня, и я хотел бы использовать его. Можете ли вы рассказать о своей настройке меток, чтобы избежать нескольких сборок? Я бы предпочел избежать дополнительных шагов, поэтому, если это понадобится, я могу перейти с bash -c' выше. –

+0

В приведенном выше ямле сборка и тегирование происходит в разделе миграции. На первый взгляд это на самом деле не очевидно, но прикрепить докеры к тэгам, когда вы указываете свойства сборки и изображения, в силу чего свойство изображения указывает тег для этой сборки. Затем это можно использовать без запуска новой сборки (если вы посмотрите в Интернете, вы увидите, что она не имеет сборки, а только свойство изображения). Вот еще некоторые подробности https://docs.docker.com/compose/compose-file/) –

+0

Это очень информативно (и я полностью пропустил это в документах), спасибо. –

0

Если вам необходимо запустить более одного процесса демона, есть в режиме не-отделил suggestion in the Docker documentation to use Supervisord поэтому все суб-демоны будут выводиться на стандартный вывод.

From another SO question, I discovered you can redirect the child processes output to the stdout. Таким образом, вы можете увидеть все выходные данные!

1

Используйте такой инструмент, как wait-for-it или dockerize. Это небольшие сценарии оболочки, которые вы можете включить в образ вашего приложения. Или напишите свой собственный скрипт-оболочку, чтобы выполнить больше команд приложения. в соответствии с: https://docs.docker.com/compose/startup-order/

9

Здесь вы можете использовать точку входа. точка входа в докер выполняется перед командой, а команда - это команда по умолчанию, которая должна запускаться при запуске контейнера. Таким образом, большинство приложений обычно выполняют процедуру настройки в файле начальной точки, и в последнем случае они позволяют запускать команду.

сделать файл сценария оболочки может быть как docker-entrypoint.sh (имя не имеет значения) со следующим содержимым в нем.

#!/bin/bash 
python manage.py migrate 
exec "[email protected]" 

в Докер-compose.yml файла использовать его с entrypoint: /docker-entrypoint.sh и зарегистрировать команду в command: python manage.py runserver 0.0.0.0:8000 P.S: не забудьте скопировать docker-entrypoint.sh вместе с вашим кодом.

-5

попробуйте использовать ";" для разделения команд, если вы находитесь в двух действиях , например.

command: "sleep 20; echo 'a'"

-1

Хотя это не совсем отношение к вопросу, отправляя его здесь упаковывают это поможет кому-то. Если вы хотите запустить команду перед запуском контейнера, вы можете запустить контейнер в обычном режиме. Затем войдите в контейнер и внесите изменения. Затем вы можете зафиксировать контейнер как новое изображение. Это новое изображение можно использовать для обеспечения того, чтобы все необходимые изменения существовали до запуска контейнера.

Смежные вопросы