Жизненный цикл Dockerfile, docker-compose и swarm mode

Я использую докер 3.5. В этой версии докера у меня проблема с зависимостями узлов во время запуска. Я попытался решить эту проблему, так как рекомендовалось использовать внешний sh скрипт, копирующий в файл докера. Это привело к большему количеству проблем. Например, `скрипт присутствует, но выполнение не было обнаружено, выполнено, но программа не была запущена. Мой docker-compose работает, но режим роя не работает и так далее ...

Думаю, я не совсем понимаю жизненный цикл Docker. Представим, что у нас есть Dockerfile, docker-compose.yml и docker-swarm.yml. У каждого из них есть инструкции CMD и ENTRYPOINT.

Начиная docker-compose, я могу определить, что моя служба ожидает требуемого (из-за сценария ожидания). В случае, если я использую режим роя, я получаю сбой, и моя служба не может запуститься правильно.

Не могли бы вы помочь с рассмотрением жизненного цикла?

есть инструкция:

  • CMD (файл докера)
  • ENTRYPOINT (файл докера)
  • точка входа (docker-compose)
  • команда (docker-compose)
  • точка входа (докер-рой)
  • команда (докер-рой)

Можно ли получить информацию о порядке выполнения заданных инструкций для разных сценариев?


person Sergii    schedule 27.05.2019    source источник


Ответы (1)


Между точкой входа и командой нет «порядка выполнения», независимо от того, определен ли он в вашем образе (Dockerfile) или переопределен во время выполнения (с помощью файла compose или аргумента cli). Докер запускает только одну команду для запуска вашего контейнера, и когда эта команда завершается, контейнер закрывается.

Если вы определяете только точку входа или команду, докер ее запустит. Если вы определите и точку входа, и команду, докер добавит команду в качестве аргумента к точке входа. Итак, если у вас есть:

ENTRYPOINT ["/bin/app", "arg1"]
CMD ["script.sh", "arg2"]

Docker запустит ваш контейнер с помощью команды:

/bin/app arg1 script.sh arg2

это означает, что script.sh передается как аргумент cli в /bin/app.


Если вы используете синтаксис оболочки / строки вместо синтаксиса exec / json, это может показаться немного странным, поскольку синтаксис оболочки обертывает вашу команду с помощью /bin/sh -c "$string" и, что более важно, -c arg to /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 "$@"

который будет запускать любые аргументы cli для сценария точки входа, обычно значение CMD, как новый pid 1.

person BMitch    schedule 27.05.2019
comment
Не понимаю, почему исключен script.sh arg2? - person MikiBelavista; 27.05.2019
comment
Во втором примере? -c принимает только один аргумент. Остальные аргументы доступны как $1 и т. Д. Для выполняемой строки, но эта строка не содержала ничего похожего на $1. - person BMitch; 27.05.2019