当ENTRYPOINT是一个shell脚本时,Docker CMD怪异

这是一个简单的Dockerfile

FROM centos:6.6 ENTRYPOINT ["/bin/bash", "-l", "-c"] CMD ["echo", "foo"] 

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

 FROM centos:6.6 ENTRYPOINT ["/bin/sh", "-c"] CMD ["echo", "foo"] 

我以为这是一个没有定义的容器的默认ENTRYPOINT ,为什么没有这个工作?

最后,这也是有效的

 FROM centos:6.6 ENTRYPOINT ["/bin/bash", "-l", "-c"] CMD ["echo foo"] 

在提交问题之前,我想看看我是否做了明显错误的事情?
我在我的容器内使用rvm ,这需要一个loginshell才能正常工作。

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

  • 没有入口点
  • 只有CMD ["/bin/bash"]

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

如dockerfile CMD部分所述:

如果使用CMD的shellforms,那么<command>将在/bin/sh -c执行:

 FROM ubuntu CMD echo "This is a test." | wc - 

如果你想在没有shell的情况下运行你的<command> ,那么你必须将这个命令表示为一个JSON数组,并给出可执行文件的完整path

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