当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更可取。