Между точкой входа и командой не существует «порядка выполнения», независимо от того, определен ли он в вашем образе (Dockerfile) или переопределен во время выполнения (с помощью файла compose или аргумента cli). Существует только одна команда, которую docker будет запускать для запуска вашего контейнера, и когда эта команда завершается, контейнер завершается.
Если вы определяете только точку входа или команду, Docker запустит это. Если вы определите и точку входа, и команду, докер добавит команду в качестве аргумента к точке входа. Так что если у вас есть:
ENTRYPOINT ["/bin/app", "arg1"]
CMD ["script.sh", "arg2"]
Docker запустит ваш контейнер командой:
/bin/app arg1 script.sh arg2
означает, что script.sh
передается в качестве аргумента cli для /bin/app
.
Если вы используете синтаксис shell / string вместо синтаксиса exec / json, это может стать немного странным, так как синтаксис оболочки оборачивает вашу команду /bin/sh -c "$string"
и, что более важно, аргумент -c
в /bin/sh
принимает только один аргумент. Это значит:
ENTRYPOINT /bin/app arg1
CMD script.sh arg2
Бежит:
/bin/sh -c "/bin/app arg1" /bin/sh -c "script.sh arg2"
, который в конечном итоге запустится:
/bin/app arg1
Стандартный рабочий процесс для вызова команды после запуска сценария точки входа должен включать следующую строку в конец сценария entrypoint.sh:
exec "$@"
, который будет запускать любые аргументы в сценарии точки входа, обычно значение CMD, как новый pid 1.