在启动 Docker 容器时运行命令行

7

就我的理解,您可以在使用RUN构建镜像或者使用CMD运行容器时运行命令行。是否有办法在启动 docker 容器时这样做呢?

我的目标是在键入docker start my_container_name后自动运行 gcloud datastore。

如果可能的话,我需要对 Dockerfile 进行哪些更改?

(我已经安装了所有必需的软件包,并且可以在docker run --name my_container_name -i -t my_image_name之后运行该命令,但我希望它也可以在启动容器时运行)


我认为你需要使用 docker run 命令。例如:docker run -d -p 80:80 my_image service nginx start,详情请参考文档 - Krishna Chaurasia
我认为每次使用docker run时,我都会创建一个新的容器。我不应该能够多次重复使用同一个容器吗? - anmarlea
你的 Dockerfile 包含了什么内容? - Saeed
我安装了所有我正在使用的软件包(python,bash,gcloud和其他依赖项),然后我可以执行RUN gcloud...CMD gcloud...,所以这个命令没有问题。但是,我想在创建容器后自动运行相同的命令,这可能吗?就像使用docker run时执行的那样,我希望它能够通过docker start执行。 - anmarlea
1
创建一个容器并不昂贵。只需删除旧容器,并使用新命令启动一个新容器即可。通常你不需要使用 docker start 命令。 - David Maze
不需要这样做,因为他们在提出答案时已经评论说当执行 docker start 命令时该命令也在运行,但我没有看到输出。使用 docker start -a <container_name> 可以查看日志。感谢大家的回答! - anmarlea
1个回答

11

Docker在构建镜像时执行RUN命令。

Docker在启动容器时执行ENTRYPOINT命令。CMD作为ENTRYPOINT的参数。当您从镜像创建容器时,可以覆盖它们。它们在Dockerfile中的目的是为将来从此镜像创建容器时提供默认值。

考虑以下示例:

FROM debian:buster

RUN apt update && apt install procps

ENTRYPOINT ["/usr/bin/ps"]
CMD ["aux"]

RUN 命令会将 ps 命令添加到镜像中,但不会执行 ENTRYPOINTCMD 命令。当你运行容器时,它们才会被执行:

# create a container named 'ps' using default CMD and ENTRYPOINT
docker run --name ps my_image
# equivalent to /usr/bin/ps aux

# start the existing container 'ps'
docker start ps
# equivalent to /usr/bin/ps aux

# override CMD
docker run my_image au
# equivalent to /usr/bin/ps au

# override both CMD and ENTRYPOINT
docker run --entrypoint=/bin/bash my_image -c 'echo "Hello, world!"'
# will print Hello, world! instead of using ps aux

# no ENTRYPOINT, only CMD
docker run --entrypoint="" my_image /bin/bash -c 'echo "Hello, world!"'
# the output is the same as above

每次你使用 docker run 命令时,都会创建一个容器。使用的 ENTRYPOINTCMD 将被保存为容器属性,并在每次启动容器时执行。

如果我使用最后两个命令之一创建的容器之一运行docker start container_name,我是否也会在终端上看到“Hello, world!”? 如果是这样,那将是我正在寻找的解决方案。 - anmarlea
@anmarlea,你需要执行 docker start -a <container_name> 命令。这样它就会附加输出流并转发信号(如 Ctrl+C)。更多信息请参见 docker start --help - anemyte
哇,我正好在寻找 docker start -a <container_name>。当使用 docker run 命令时,我已经能够运行该命令,但是在使用 docker start 时却不能,原因是我缺少了 -a 参数。非常感谢! - anmarlea
1
@anmarlea 问题在于,即使没有 -a 参数,Docker 仍然运行了该命令,只是您没有看到输出。在这种情况下,您可以使用 docker logs <container_name> 命令检索输出。 - anemyte
我也考虑过这种可能性,但为了确认它,我进行了一些测试,但无法证实。由于我也想要日志,所以我在寻找一种方法来在同一个终端中观看整个过程,这就是为什么我的问题可能会有点混淆(询问如何在已经运行命令后运行命令)。谢谢! - anmarlea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接