我有一个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>)

我究竟做错了什么...

最佳答案

ENTRYPOINTCMD语句(还有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/

10-13 03:35