我有一个Dockerfile
,它具有:
ENTRYPOINT /usr/sbin/apache2ctl
CMD ["-D", "FOREGROUND"]
但是,如果我使用
docker ps -a --no-trunc
查看entrypoint命令:81496448b4d3d134ffc4c7fa7d46afd08cb52b608aa07d0b6192993c0e30c7c7 raidenapache1234:latest "/bin/sh -c /usr/sbin/apache2ctl -D FOREGROUND" About an hour ago Exited (1) About an hour ago focused_blackburn
它没有将引号传递给
/bin/sh -c
-/bin/sh -c /usr/sbin/apache2ctl -D FOREGROUND
。应该/我打算是:
/bin/sh -c "/usr/sbin/apache2ctl -D FOREGROUND"
失败的原因是:
docker run raidenapache1234:latest
Usage: /usr/sbin/apache2ctl start|stop|restart|graceful|graceful-stop|configtest|status|fullstatus|help
/usr/sbin/apache2ctl <apache2 args>
/usr/sbin/apache2ctl -h (for help on <apache2 args>)
我究竟做错了什么...
最佳答案
ENTRYPOINT
和CMD
语句(还有RUN
)有两种形式。如果以看起来像JSON数组的形式传递它,则传递的正是数组中传递的内容(不进行扩展或其他操作:CMD ["ls", "*"]
查找一个名为*
的文件)。如果传递裸字符串,则将其包裹在sh -c
中。
Docker文档discussing ENTRYPOINT
and CMD
together中的表还有更多详细信息。由于您的Dockerfile使用ENTRYPOINT
作为裸字符串,因此CMD
被完全忽略。
对于日常使用,我建议只用一个CMD
编写所有代码
# no ENTRYPOINT
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
如果您必须具有
ENTRYPOINT
,则还需要使用JSON形式ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]
(我更喜欢为执行一些设置的包装脚本然后保留
ENTRYPOINT
来运行exec "$@"
的情况保留CMD
;这是一种有用的模式,将ENTRYPOINT
用作二进制名称会很困难。如果需要,您还会得到笨拙的docker run --entrypoint ... imagename arg ...
序列在容器中运行其他二进制文件。)关于docker - Dockerfile CMD不会在/bin/sh -c入口点周围带有引号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57221807/