Несколько команд в директиве Docker CMD

Не понимаю, что происходит, когда я пытаюсь выполнить две команды во время выполнения через директиву CMD в `Dockerfile. Я предположил, что это должно работать:

CMD ["/etc/init.d/nullmailer", "start", ";", "/usr/sbin/php5-fpm"]

Но это не работает. Контейнер не запускается. Поэтому я должен был сделать это следующим образом:

CMD ["sh", "-c", "/etc/init.d/nullmailer start ; /usr/sbin/php5-fpm"]

Я не понимаю. Почему это? Почему первая строка не подходит? Может кто-нибудь объяснить мне этот «формат оболочки CMD против формата JSON и т. Д.». Простыми словами.

Просто отметить - то же самое было с директивой command: в docker-compose.yml, как ожидалось.

22 голоса | спросил Vladan 26 PMpSun, 26 Apr 2015 21:08:50 +030008Sunday 2015, 21:08:50

3 ответа


20

Я полагаю, что разница может иметь значение, вторая команда обрабатывает оболочку, а первая - нет. В официальной документации есть exec и shell, ваша первая команда - это форма exec, и это не так расширяйте переменные среды, а второй -. Таким образом, возможно, что с помощью формы exec команда может выйти из строя из-за ее зависимости от обработки оболочки. Вы можете проверить это, запустив docker logs CONTAINERID

Ваша вторая команда, форма оболочки, эквивалентна -

CMD /etc/init.d/nullmailer start ; /usr/sbin/php5-fpm

Выдержки из документации -

  

Примечание. В отличие от формы оболочки форма exec не вызывает командную оболочку. Это означает, что нормальной обработки оболочки не происходит. Например, CMD [ "echo", "$HOME" ] не будет выполнять замену переменных на $HOME

ответил Daniel t. 27 AMpMon, 27 Apr 2015 07:25:14 +030025Monday 2015, 07:25:14
1

Я не думаю, что вы должны положить полу запятую после «start»

вместо

CMD ["/etc/init.d/nullmailer", "start", ";", "/usr/sbin/php5-fpm"]

попробуйте

CMD ["/etc/init.d/nullmailer", "start", "/usr/sbin/php5-fpm"]

, поскольку docker использует «sh -c», команда выше будет выполняться как ниже

/etc/init.d/nullmailer start
/etc/init.d/nullmailer /usr/sbin/php5-fpm
ответил vedat 7 MonEurope/Moscow2015-12-07T20:42:20+03:00Europe/Moscow12bEurope/MoscowMon, 07 Dec 2015 20:42:20 +0300 2015, 20:42:20
0

Я предполагаю, что первая команда завершилась неудачно, потому что в форме DOCKER CMD выполняется только первый параметр, остальные передаются в эту команду.

Вторая форма работает, потому что все команды разделены символом ";" подаются в команду sh, которая их выполняет.

ответил devrimbaris 1 TueEurope/Moscow2015-12-01T18:06:45+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 18:06:45 +0300 2015, 18:06:45

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132