题 如何在运行docker镜像时覆盖CMD?


我想检查由其他人创建的docker镜像,同时指定了入口点和cmd,例如:

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

我目前这样做:

docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login

有没有办法将CMD重写为空(所以我不必使用“--login”)?


82
2018-05-10 12:59






答案:


你可以直接进入 docker run -it --entrypoint=/bin/bash $IMAGE -i (您将从映像启动一个新容器并以交互方式获取bash shell),然后在该容器中运行entrypoint命令。

然后,您可以检查正在运行的状态的正在运行的容器。

编辑:自从Docker 1.3你可以使用 exec 在正在运行的容器中运行进程。像往常一样启动容器,然后通过发出以下命令输入:

docker exec -it $CONTAINER_ID /bin/bash

假设安装了bash,您将获得对正在运行的容器的shell访问权限。


90
2018-05-12 09:28



不会执行“/ usr / sbin / apache2ctl / bin / bash”吗? (因为你的例子没有覆盖入口点,它将使用Dockerfile中定义的入口点 - 或者我错过了什么?) - warp
对于较旧/较新的docker版本,这可能是不同的吗?它肯定为我提供了切入点: gist.github.com/warpr/26a5cc471dce7fcf9021 。这是在Ubuntu 13.10上使用docker 0.10.0。 - warp
通过 -entrypoint 覆盖入口点。查看编辑的答案 - Panagiotis Moustafellos
我知道传递--entrypoint会覆盖入口点。但是当我使用--entrypoint时,如何将CMD重写为空? (对于bash,我可以使用-i或--login之类的东西,但不是我可能想要使用的所有入口点都有一个等效的“虚拟”参数)。 - warp
至少在Docker v1.11.1中,覆盖--entrypoint似乎也阻止了CMD正常附加到入口点。只有在没有覆盖入口点时才会发生这种情况。 - Jasmine Hegman


看到: https://docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

相关部分:

CMD(默认命令或选项) 回想一下Docker命令行中的可选COMMAND:

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

此命令是可选的,因为创建IMAGE的人可能已使用Dockerfile CMD提供了默认COMMAND。作为操作员(从图像运行容器的人),您可以通过指定新的COMMAND来覆盖该CMD。

如果图像还指定了ENTRYPOINT,则CMD或COMMAND将作为参数附加到ENTRYPOINT。

所以做你想要的你需要的东西 只要 指定一个cmd,并覆盖使用 /bin/bash。不是很“空”,但它完成了99%的工作。


19
2018-06-12 07:31



哎呀,我忽略了一个细节。除了缩短 --login至 -l 我想你的解决方案已经很好了。 - Simon Thum
这是我今天看到的一件有趣的事情:命令没有被覆盖,它被附加了。这是来自容器内部的PS。请注意,我添加的命令是echo“设置db”,内置命令是/ usr / bin / geth。我也将入口点设置为“”。 1 ? Ssl 0:00 /usr/bin/geth echo setting up db - Paul S
泊坞窗参考链接不再有效 - 找不到明显的替代品。 - Chris Kimpton
我刚修好了,但我发现很难找到;( - Simon Thum


对于任何人来这里覆盖入口点和命令以传递其他命令,例如运行bash而不是入口点脚本然后运行带参数的其他命令(我从其他答案中不清楚):

 docker run [other options] --entrypoint '/bin/sh' $IMAGE -c 'npm link gulp gulp-sass gulp-sourcemaps'

-c 'npm link ...' 是参数 /bin/sh 所以在这里你可以传递你想要在容器中运行的任何命令。 /bin/sh 是用于高山图像, /bin/bash 最有可能用于其他图像。


7
2018-05-04 07:28



只是一个addtion shell命令应该是基于json的写入,所以不要引用单引号 '...' 使用双引号 "..." - Jimmy Obonyo Abor