【问题标题】:Run a command line when starting a docker container启动 docker 容器时运行命令行
【发布时间】:2021-03-23 10:00:19
【问题描述】:

就我而言,您可以在使用RUN 构建映像或使用CMD 运行容器时运行命令行。启动 docker 容器时有什么办法吗?

我的目标是在输入 docker start my_container_name 后自动运行 gcloud 数据存储区。

如果可能,我应该对我的 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,详情请见docs
  • 我认为每次使用 docker run 时我都在创建一个新容器。我不应该能够多次重复使用相同的东西吗?
  • Dockerfile的内容是什么?
  • 好吧,我安装了我正在使用的所有软件包(python、bash、gcloud 和其他依赖项),后来我能够执行 RUN gcloud...CMD gcloud... 所以没有该命令的问题。但是,我想在自动创建容器后运行相同的命令,这可能吗?与使用docker run 时执行的方式相同,我希望使用docker start 执行它
  • 创建一个容器并不昂贵。只需删除旧容器并使用新命令启动一个新容器。您通常不需要docker start

标签: docker dockerfile


【解决方案1】:

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,在终端上?如果是这样,那将是我正在寻找的解决方案
  • @anmarlea 你需要docker start -a <container_name>。这样,它将附加输出流和转发信号(如 Ctrl+C)。请参阅docker start --help 了解更多信息。
  • 哇,我正好在找docker start -a <container_name>。使用 docker run 时我已经能够运行命令,但使用 docker start 时不能运行,这是因为我缺少 -a 参数。非常感谢!
  • @anmarlea 问题是,即使没有 -a 键,docker 也确实运行了命令,您只是没有看到输出。在这种情况下,您可以使用 docker logs <container_name> 检索输出。
  • 我也在考虑这种可能性,但我进行了一些测试以检查它并且无法确认。因为我也想要日志,所以我想以某种方式在同一个终端中观看整个事情,这就是为什么我的问题看起来有点令人困惑(询问如何在已经运行命令后运行它)。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2019-05-21
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
相关资源
最近更新 更多