当我尝试在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处理有关,而第一个命令不会。 根据官方文档 ,有exec
和shell
forms,你的第一个命令是一个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