1

我正在使用 docker 3.5。在这个 docker 版本中,我在开始时遇到了节点依赖关系的问题。我尝试解决它,因为建议使用外部sh脚本处理 docker 文件。它导致更多的问题。例如,`脚本存在,但未检测到执行,已执行,但程序未启动。我的 docker-compose 启动了,但是 swarm 模式失败了等等......

我想我不清楚 Docker 生命周期。让我们假设我们有Dockerfile和。他们每个人都有一个和指令。docker-compose.ymldocker-swarm.ymlCMDENTRYPOINT

开始docker-compose我可以检测到我的服务正在等待所需的服务(因为等待脚本)。如果我使用 swarm 模式,我会失败并且我的服务无法正确启动。

你能帮忙考虑一下生命周期吗?

有说明:

  • CMD(码头文件)
  • 入口点(泊坞窗文件)
  • 入口点(docker-compose)
  • 命令(码头工人撰写)
  • 入口点(码头群)
  • 命令(码头工人群)

是否可以获得有关不同场景的指定指令执行顺序的信息?

4

1 回答 1

3

入口点和命令之间没有“执行顺序”,无论它是在您的映像(Dockerfile)中定义还是在运行时覆盖(使用 compose 文件或 cli 参数)。docker 只会运行一个命令来启动您的容器,当该命令退出时,容器就会退出。

如果您只定义一个入口点或命令,docker 将运行它。如果您同时定义了入口点和命令,docker 会将命令作为参数附加到入口点。因此,如果您有:

ENTRYPOINT ["/bin/app", "arg1"]
CMD ["script.sh", "arg2"]

Docker 将使用以下命令运行您的容器:

/bin/app arg1 script.sh arg2

意思script.sh是作为 cli 参数传递给/bin/app.


如果你使用 shell/string 语法而不是 exec/json 语法,这可能会有点奇怪,因为 shell 语法用 a 包装你的命令/bin/sh -c "$string",更重要的是,-carg to/bin/sh只接受一个参数。这意味着:

ENTRYPOINT /bin/app arg1
CMD script.sh arg2

会跑:

/bin/sh -c "/bin/app arg1" /bin/sh -c "script.sh arg2"

最终将运行:

/bin/app arg1

运行入口点脚本后调用命令的标准工作流程是在 entrypoint.sh 脚本的末尾包含以下行:

exec "$@"

它将运行任何 cli 参数到入口点脚本,通常是 CMD 的值,作为新的 pid 1。

于 2019-05-27T15:06:34.373 回答