ENTRYPOINT是Shell脚本时的Docker CMD怪异

Sea*_*fet 5 docker dockerfile

这是一个简单的Dockerfile

FROM centos:6.6
ENTRYPOINT ["/bin/bash", "-l", "-c"]
CMD ["echo", "foo"]
Run Code Online (Sandbox Code Playgroud)

不幸的是,它不起作用。运行生成的结果容器时,没有任何回显。
如果您将其注释掉,ENTRYPOINT那么它将起作用。但是,如果将设置ENTRYPOINT为/bin/sh -c,则它将再次失败

FROM centos:6.6
ENTRYPOINT ["/bin/sh", "-c"]
CMD ["echo", "foo"]
Run Code Online (Sandbox Code Playgroud)

我以为这是ENTRYPOINT没有定义容器的默认容器,为什么没有用?

最后,这也有效

FROM centos:6.6
ENTRYPOINT ["/bin/bash", "-l", "-c"]
CMD ["echo foo"]
Run Code Online (Sandbox Code Playgroud)

在提交问题之前,我想看看我是否做错了明显的事情?
我在rvm容器内使用哪种需要登录shell才能正常工作。

Von*_*onC 3

请注意,官方 centos 6 映像的默认入口点/cmd是:

  • 无入口点
  • 仅有的CMD ["/bin/bash"]

如果您使用该-c命令,则需要传递一个参数(这是完整的命令):"echo foo"。
不是一系列参数 ( CMD ["echo", "foo"])。

如dockerfile CMD部分所述:

如果您使用 CMD 的 shell 形式,那么将<command>执行/bin/sh -c:

FROM ubuntu
CMD echo "This is a test." | wc -
Run Code Online (Sandbox Code Playgroud)

如果您想在没有 shell 的情况下运行<command>,则必须将命令表示为 JSON 数组,并提供可执行文件的完整路径

由于echo是 bash 和 C shell 中的内置命令,因此这里的 shell 形式更可取。