存在 ENTRYPOINT 时,Docker 运行命令忽略部分 Dockerfile CMD

标签 docker dockerfile

当我运行我的 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,也会发生同样的情况而不是 -it .

如果我使用 CMD 作为覆盖的 docker run 参数运行,也会发生同样的情况:
$ 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/builder/#understand-how-cmd-and-entrypoint-interact

关于存在 ENTRYPOINT 时,Docker 运行命令忽略部分 Dockerfile CMD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37206899/

相关文章:

jenkins - 无法以非 root 用户身份运行 docker?

linux - 限制其他 linux 用户访问 docker 容器

nginx - 无法连接到 Docker Nginx 构建

docker - 如何附加到 dockerfile 或 docker run 中的路径

docker - 如何以用户 "nobody?"在临时容器中运行我的 Go 应用程序

docker - 无法在 Compose : ERROR: Network declared as external, 中使用现有网络但找不到

docker - "Kind"写入节点创建集群失败

docker - 如果不在root下运行,Docker cronjob权限不正确

即使使用 -it 运行 Docker 容器也会退出

docker - docker ls:无法打开目录 '.':权限被拒绝