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

war*_*arp 186 docker

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

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]
Run Code Online (Sandbox Code Playgroud)

我目前这样做:

docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login
Run Code Online (Sandbox Code Playgroud)

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

小智 195

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

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

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

docker exec -it $CONTAINER_ID /bin/bash

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

  • 为什么在`$IMAGE`后面有一个`-i`? (6认同)
  • 我知道传递 --entrypoint 会覆盖入口点。但是当我使用 --entrypoint 时,如何将 CMD 覆盖为空?(对于 bash,我可以使用 -i 或 --login 之类的东西,但并非我可能想要使用的所有入口点都具有等效的“虚拟”参数)。 (4认同)

Sim*_*hum 46

请参阅:https : //docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

相关部分:

CMD(默认命令或选项)在 Docker 命令行中调用可选的 COMMAND:

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 33

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

 docker run [other options] --entrypoint '/bin/sh' $IMAGE -c 'npm link gulp gulp-sass gulp-sourcemaps'
Run Code Online (Sandbox Code Playgroud)

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

  • 只是一个附加的 shell 命令应该是基于 json 的 writen ,所以不要用单引号 `'...'` 引用双引号 `"..."` (2认同)
  • 或者只是传递尽可能多的 --entrypoint 参数 (2认同)