Жизненный цикл Dockerfile, docker-compose и swarm mode - PullRequest
1 голос
/ 27 мая 2019

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

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

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

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

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

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

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

1 Ответ

2 голосов
/ 27 мая 2019

Между точкой входа и командой не существует «порядка выполнения», независимо от того, определен ли он в вашем образе (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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...