Вы можете docker-compose run
произвольную команду в новом контейнере, которая (в основном) совпадает с одним из контейнеров, которые вы описываете в своем файле docker-compose.yml
docker-compose run web-app ./manage.py migrate
. Хитрость заключается в том, что ваш сценарий точки входа должен обязательно выполнить часть «command» команды docker run
, которую он получает в качестве аргументов командной строки. Если это сценарий оболочки, он может заканчиваться строкой
exec "$@"
В вашем Dockerfile это означает, что вам нужно указать ENTRYPOINT
и значение по умолчанию CMD
для запуска. ENTRYPOINT
должен использовать форму JSON -array. CMD
может быть либо формой JSON, либо пустой строкой.
ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"]
CMD ./manage.py runserver 0.0.0.0:8000
Поскольку скрипт точки входа в конечном итоге отвечает за выполнение всего контейнера, вы можете создавать команды для запуска. Вы, вероятно, уже сделали это, проверив переменную окружения $MIGRATE
. Обычно перед входом в команду основного контейнера используется сценарий точки входа для выполнения такого рода настройки, но вы также можете просто полностью заменить команду.
#!/bin/sh
set -e
# Run migrations if requested (possibly in addition to another command)
if [ "$MIGRATE" = "y" ] || [ "$1" = "migrate" ]; then
./manage.py migrate
fi
# Run the `command:`, `CMD`, or command-line command
case "$1" of
migrate)
# already done above
exit 0
;;
seed)
exec ./manage.py loaddata "$@"
;;
*)
exec "$@"
;;
esac