当入口点出现时,Docker运行命令忽略Dockerfile CMD的一部分

当我运行我的docker容器时,它似乎只遵守CMD数组(python可执行文件)的第一个元素,并忽略尾随参数。

Dockerfile:

FROM ubuntu:14.04 ENTRYPOINT ["/bin/bash", "-c"] CMD ["/virtualenv/bin/python", "/mycode/myscript.py", "--param1"] 

运行命令:

 $ docker run --rm -it --volume $(pwd)/..:/mycode --volume mycontainer-virtualenv:/virtualenv mycontainer 

输出:

 Python 3.4.3 (default, Oct 14 2015, 20:28:29) [GCC 4.8.4] on linux Type "help", "copyright", "credits" or "license" for more information. >>> 

如果我运行--detach而不是--detach ,则会发生同样的情况。

如果我使用CMD作为覆盖docker运行参数运行,也会发生同样的情况:

 $ docker run --rm -it --volume $(pwd)/..:/mycode --volume mycontainer-virtualenv:/virtualenv mycontainer /virtualenv/bin/python /mycode/myscript.py --param1 Python 3.4.3 (default, Oct 14 2015, 20:28:29) [GCC 4.8.4] on linux Type "help", "copyright", "credits" or "license" for more information. >>> 

如果我用bash运行容器,并从bash提示符运行CMD,它工作正常:

 $ docker run --rm -it --volume $(pwd)/..:/mycode --volume mycontainer-virtualenv:/virtualenv mycontainer bash root@d6a990e81c22:/# /virtualenv/bin/python /mycode/myscript.py --param1 Hello world! 

你可能想要

 CMD ["/virtualenv/bin/python /mycode/myscript.py --param1"] 

代替

 CMD ["/virtualenv/bin/python", "/mycode/myscript.py", "--param1"] 

CMDENTRYPOINT都出现在Dockerfile中时,CMD作为默认参数进入到ENTRYPOINT。 所以你基本上在做

 bash -c "/virtualenv/bin/python" "/mycode/myscript.py" "--param1" 

当你想要的时候

 bash -c "/virtualenv/bin/python /mycode/myscript.py --param1" 

https://docs.docker.com/engine/reference/builder/#cmd https://docs.docker.com/engine/reference/builder/#entrypoint https://docs.docker.com/engine/reference/build设者/#明白,怎么-CMD-和入口点,相互作用