Dockerfile,docker-compose 和 swarm 模式生命周期

Dockerfile, docker-compose and swarm mode lifecycle

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

我想我不清楚 Docker 生命周期。假设我们有 Dockerfiledocker-compose.ymldocker-swarm.yml。他们每个人都有一个 CMDENTRYPOINT 指令。

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

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

有说明:

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

入口点和命令之间没有 "execution order",无论它是在您的图像(Docker文件)中定义还是在 运行 时被覆盖(使用撰写文件或 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 语法用 /bin/sh -c "$string" 包装你的命令,更重要的是,/bin/sh-c arg 只需要一个参数。这意味着:

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。