就我而言,您可以在使用 RUN
构建映像或使用 CMD
运行容器时运行命令行。在启动 docker 容器时无论如何都要这样做吗?
我的目标是在输入 docker start my_container_name
后自动运行 gcloud 数据存储区。
如果可以,我应该对我的 Dockerfile 应用哪些更改?
(我已经安装了所有需要的包,我可以在 docker run --name my_container_name -i -t my_image_name
之后运行该命令,但我希望它在启动容器时也能运行)
答案 0 :(得分:2)
Docker 在构建映像时执行 RUN
命令。
Docker 执行 ENTRYPOINT
命令在您启动容器时。 CMD
作为 ENTRYPOINT
的参数。当您从图像创建容器时,这两者都可以被覆盖。它们在 Dockerfile 中的目的是为您或其他人将来从该镜像创建容器时提供默认值。
考虑示例:
FROM debian:buster
RUN apt update && apt install procps
ENTRYPOINT ["/usr/bin/ps"]
CMD ["aux"]
RUN
命令将 ps
命令添加到图像中,ENTRYPOINT
和 CMD
不会执行,但它们会在您运行容器时执行:
# 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
时都会创建一个容器。使用的 ENTRYPOINT
和 CMD
被保存为容器属性并在每次启动容器时执行。