Обновление: Если базовое изображение имеет entrypoint.sh
, оно запустится, но если вы переопределите свою собственную точку входа, тогда контейнер запустит переопределенную точку входа.
Если вычтобы переопределить поведение базового образа по умолчанию, вы можете изменить его, в противном случае вам не нужно переопределять его из docker-compose.
Что на самом деле делает entrypoint: "entrypoint.sh"?
Это полностью зависит от сценария или команды в entrypoint.sh, но можно учесть несколько вещей.
Инструкция ENTRYPOINT позволяет настроить контейнер, который будет выполняться как исполняемый файл. Он похож на CMD, потому что он также позволяет указывать команду с параметрами. Разница заключается в команде ENTRYPOINT, и параметры не игнорируются, когда контейнер Docker работает с параметрами командной строки. (Существует способ игнорировать ENTTRYPOINT, но маловероятно, что вы это сделаете.)
Проще говоря, точкой входа может быть сложный сценарий bash, например, в случае mysql точка входа , что превышает 200 LOC и выполняет следующую задачу.
- запустить сервер MySQL
- дождаться, пока сервер MySQL не будет работать
- Создать базу данных
- Может выполнять миграцию БД или инициализацию БД.
С CMD такая сложная задача невозможна, так как в CMD вы можете запустить bash, но для его работы будет больше головной боли. Также это делает Dockerfile простым и помещает сложную задачу в точку входа.
Когда есть точка входа, все, что передается в CMD, будет рассматриваться как аргумент для точки входа.
В вашем случае, CMDCMD ["python", "manage.py", "test", "--noinput"]
будет передано в качестве аргумента, и лучше всего его использовать:
# set of command
#start long running process at the end that is passed from CMD
exec "$@"
Наконец, вызывается конструкция оболочки exec, так что последняя указанная команда становитсяPID контейнера 1. $@
- это переменная оболочки, которая означает «все аргументы»,
use-a-script-to-initialize-stateful-container-data
cmd-vs-entrypoint