Docker CMD指令中有多个命令

当我尝试在Dockerfile中通过CMD指令在运行时执行两条命令时,我不明白发生了什么。 我认为这应该工作:

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

但它不工作。 容器尚未启动。 所以我必须这样做:

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

我不明白。 这是为什么? 为什么第一行不正确? 有人可以解释我这些“CMDshell格式与JSON格式等”的东西。 简而言之,

只需要注意 – 正如预期docker-compose.yml ,在docker-compose.yml command:是一样的。

我相信这个差别可能与第二个命令的shell处理有关,而第一个命令不会。 根据官方文档 ,有execshellforms,你的第一个命令是一个execforms,它不能扩展环境variables,而第二个命令是。 所以可能的是,通过使用execforms,命令可能由于依赖于shell处理而失败。 您可以通过运行docker logs CONTAINERID来检查

你的第二个命令,shell的forms,相当于 –

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

摘自文档 –

注意:与shellforms不同,execforms不会调用命令shell。 这意味着正常的shell处理不会发生。 例如, CMD [ "echo", "$HOME" ]不会在$HOME上进行variablesreplace。 如果你想要shell处理,那么要么使用shell的forms,要么直接执行一个shell,例如: CMD [ "sh", "-c", "echo", "$HOME" ]

我想第一个命令失败,因为在DOCKER CMDforms,只有第一个参数被执行,其余的被馈送到这个命令。

第二种forms是有效的,因为所有的命令都与“;” 被送入sh命令,执行它们。

我不认为你应该在“开始”之后加上半个逗号

而不是使用

 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