运行docker映像时如何覆盖CMD?


123

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

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

我目前正在:

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

有没有办法覆盖CMD为空(因此我不必使用“ --login”)?

Answers:


125

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

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

编辑:自Docker 1.3起,您可以exec在运行中的容器中运行进程。按照通常的方式启动容器,然后发出以下命令输入容器:

docker exec -it $CONTAINER_ID /bin/bash

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


那不会执行“ / usr / sbin / apache2ctl / bin / bash”吗?(因为您的示例未覆盖入口点,它将使用Dockerfile中定义的入口点-还是我遗漏了某些东西?)
扭曲

对于较旧/较新的Docker版本,这是否有所不同?它肯定为我运行了入口点:gist.github.com/warpr/26a5cc471dce7fcf9021。这在Ubuntu 13.10上使用docker 0.10.0。
2014年

4
我知道传递--entrypoint会覆盖入口点。但是,当我使用--entrypoint时,如何覆盖CMD为空?(对于bash,我可以使用-i或--login之类的东西,但并非我可能要使用的所有入口点都具有等效的“虚拟”参数)。
2014年

1
至少在Docker v1.11.1中,似乎覆盖--entrypoint还会阻止将CMD正常附加到入口点。这似乎仅在未覆盖入口点时发生。
茉莉·希格曼

1
为什么会有一个-i之后$IMAGE
艾尔·莱文

27

参见: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%的工作。


糟糕,我忽略了一个细节。除了缩短--login-l我想您的解决方案已经足够了。
西蒙·图姆2014年

这是我今天看到的一件有趣的事情:该命令没有被覆盖,而是附加了。这是容器内部的PS。请注意,我添加的命令是echo“设置数据库”,内置命令是/ usr / bin / geth。另外,我将入口点设置为“”。1 ? Ssl 0:00 /usr/bin/geth echo setting up db
Paul S

码头工人参考链接不再有效-找不到明显的替代品。
克里斯·金普顿

我只是修复了它,但我也发现它很难找到;(
Simon Thum

15

对于任何来这里重写输入点AND命令以传递其他命令的人,例如,运行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最有可能用于其他图像。


1
只是一个加壳命令应该基于json编写,所以不要用单引号引起来,而应'...'使用双引号"..."
Jimmy Obonyo Abor

或根据需要传递尽可能多的--entrypoint参数
Nick Roz

这似乎不起作用:“ exec:\”-c \“:在$ PATH中找不到可执行文件”:未知。
理查德

检查容器中的路径,也许它确实不存在。大多数图像都有,/bin/sh但您的情况可能并非如此。
infro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.