Я хочу сделать что-то вроде этого, где я могу запустить несколько команд по порядку.
db:
image: postgres
web:
build: .
command: python manage.py migrate
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
docker
yaml
docker-compose
RustyShackleford
источник
источник
/bin/bash
sh
вместо этого:[sh, -c, "cd /usr/src/app && npm start"]
ash
на альпийском :)Я запускаю перед запуском такие вещи, как миграция, в отдельном временном контейнере, например, так (обратите внимание, файл compose должен иметь тип версии '2'):
Это помогает держать вещи в чистоте и отдельно. Две вещи для рассмотрения:
Вы должны убедиться в правильности последовательности запуска (используя зависимость_)
Вы хотите избежать нескольких сборок, что достигается с помощью первого тега, используя build и image; Вы можете обратиться к изображению в других контейнерах, то
источник
bash -c
выше.Я рекомендую использовать
sh
вместо,bash
потому что он более доступен на большинстве изображений на основе Unix (альпийский, и т. Д.).Вот пример
docker-compose.yml
:Это вызовет следующие команды по порядку:
python manage.py wait_for_db
- ждать, пока БД будет готовpython manage.py migrate
- запустить любые миграцииpython manage.py runserver 0.0.0.0:8000
- запустить мой сервер разработкиисточник
>
используется для запуска многострочного ввода (см. stackoverflow.com/a/3790497/2220370 )Это работает для меня:
docker-compose пытается разыменовать переменные перед запуском команды, поэтому, если вы хотите, чтобы bash обрабатывал переменные, вам нужно экранировать знаки доллара, удваивая их ...
... в противном случае вы получите ошибку:
источник
$${Types}
и$${Client}
. Я думаю, что это не позволит docker compose интерпретировать эти переменные и искать их значения в любой оболочке, из которой вы вызываете docker-compose, что будет означать, что bash все еще собирается разыменовать их ( после того, как docker обработал ваш.env
файл).Вы можете использовать точку входа здесь. точка входа в Docker выполняется перед командой, в то время как команда является командой по умолчанию, которая должна выполняться при запуске контейнера. Таким образом, большинство приложений, как правило, выполняют процедуру настройки в файле точки входа, и в последнем они позволяют запускать команду.
Файл сценария make shell может иметь вид
docker-entrypoint.sh
(имя не имеет значения) со следующим содержимым.в файле docker-compose.yml используйте его
entrypoint: /docker-entrypoint.sh
и зарегистрируйте команду какcommand: python manage.py runserver 0.0.0.0:8000
PS: не забудьте скопироватьdocker-entrypoint.sh
вместе с вашим кодом.источник
docker-compose run service-name ....
Еще одна идея:
Если, как и в этом случае, вы создаете контейнер, просто поместите в него скрипт запуска и запустите его с помощью команды. Или смонтируйте скрипт запуска как том.
источник
#!/bin/bash \n python manage.py migrate \n python manage.py runserver 0.0.0.0:8000
(некрасиво oneline)* ОБНОВИТЬ *
Я подумал, что лучший способ выполнить некоторые команды - написать собственный Dockerfile, который делает все, что я хочу, до запуска официального CMD из образа.
докер-compose.yaml:
Dockerfile.mongo:
Это, наверное, самый чистый способ сделать это.
* СТАРЫЙ ПУТЬ *
Я создал сценарий оболочки с моими командами. В этом случае я хотел запустить
mongod
и запустить,mongoimport
но вызовmongod
блокирует запуск остальных.docker-compose.yaml :
start_mongod.sh :
Таким образом, он разветвляет монго, выполняет моногимпорт, а затем убивает раздвоенное монго и снова запускает его, не отрываясь. Не уверен, есть ли способ присоединиться к разветвленному процессу, но это работает.
ПРИМЕЧАНИЕ. Если вы строго хотите загрузить некоторые начальные данные БД, это способ сделать это:
mongo_import.sh
Файлы mongo_fixtures / *. json были созданы с помощью команды mongoexport.
докер-compose.yaml
источник
Если вам нужно запустить более одного процесса-демона, в документации Docker есть предложение использовать Supervisord в автономном режиме, чтобы все подчиненные демоны выводились на стандартный вывод.
Из другого вопроса SO я обнаружил, что вы можете перенаправить вывод дочерних процессов на стандартный вывод. Таким образом, вы можете увидеть все результаты!
источник
Чтобы выполнить несколько команд в файле docker-compose с помощью
bash -c
.Источник: https://intellipaat.com/community/19590/docker-run-multiple-commands-using-docker-compose-at-once?show=19597#a19597
источник
Используйте такой инструмент, как wait-for-it или dockerize . Это небольшие скрипты-обёртки, которые вы можете включить в изображение вашего приложения. Или напишите свой собственный скрипт-обертку для выполнения более специфичных для приложения команд. в соответствии с: https://docs.docker.com/compose/startup-order/
источник
Я столкнулся с этим, пытаясь настроить мой контейнер jenkins для создания док-контейнеров как пользователь jenkins.
Мне нужно было прикоснуться к файлу docker.sock в Dockerfile, так как я позже свяжу его с файлом docker-compose. Пока я не прикоснулся к нему первым, его еще не было. Это сработало для меня.
Dockerfile:
докер-compose.yml:
источник
попробуйте использовать ";" разделить команды, если вы находитесь в двух версиях, например,
command: "sleep 20; echo 'a'"
источник