2016-05-13 112 views
3

當我運行我的docker容器時,它似乎只遵守CMD數組(python可執行文件)的第一個元素並忽略尾隨參數。當入口點出現時,Docker運行命令忽略Dockerfile CMD的一部分

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 

輸出:如果我跑--detach,而不是-it

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. 
>>> 

同樣的情況。

$ 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,它工作正常:

如果我用CMD運行作爲壓倒一切的搬運工運行參數

同樣也發生

$ docker run --rm -it --volume $(pwd)/..:/mycode --volume mycontainer-virtualenv:/virtualenv mycontainer bash 
[email protected]:/# /virtualenv/bin/python /mycode/myscript.py --param1 
Hello world! 

回答

3

你可能想

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

,而不是

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

當Dockerfile中都存在CMDENTRYPOINT時,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/builder/#understand-how-cmd-and-entrypoint-interact