Обновление: если в базовом образе есть entrypoint.sh
, он запустит его, но если вы переопределите свою собственную точку входа, контейнер запустит переопределяющую точку входа.
Если вы хотите переопределить поведение базового образа по умолчанию, вы можете изменить его, в противном случае вам не нужно переопределять его из docker-compose.
Что на самом деле делает точка входа: "entrypoint.sh"?
Это полностью зависит от сценария или команды внутри entrypoint.sh, но можно учесть несколько вещей.
Инструкция ENTRYPOINT позволяет настроить контейнер, который будет работать как исполняемый файл. Он похож на CMD, потому что также позволяет указать команду с параметрами. Разница заключается в том, что команда ENTRYPOINT и параметры не игнорируются, когда контейнер Docker запускается с параметрами командной строки. (Есть способ игнорировать ENTTRYPOINT, но вряд ли вы это сделаете.)
Проще говоря, точка входа может быть сложным сценарием bash, например, в случае mysql точка входа, которая превышает 200 LOC и выполняет следующую задачу.
- запустить сервер MySQL
- подождите, пока сервер MySQL включится
- Создать БД
- Может выполнять миграцию БД или инициализацию БД
Такая сложная задача невозможна с CMD, так как в CMD вы можете запустить bash, но заставить его работать будет больше головной боли. Также это делает Dockerfile простым и ставит сложную задачу в точку входа.
Когда есть точка входа, все, что передается в CMD, будет рассматриваться как аргумент для точки входа.
В вашем случае CMD - это CMD ["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- данные-контейнера с состоянием
cmd-vs-entrypoint
person
Adiii
schedule
17.10.2019