Dockerfile,docker-compose 和 swarm 模式生命周期
Dockerfile, docker-compose and swarm mode lifecycle
我正在使用 docker 3.5
。在这个 docker 版本中,我在启动时遇到了节点依赖性问题。我尝试按照建议使用外部 sh
脚本应对 docker 文件来解决它。它导致更多的问题。例如`脚本存在但未检测到执行,已执行,但程序未启动。我的 docker-compose 已启动,但 swarm 模式失败等等...
我想我不清楚 Docker 生命周期。假设我们有 Dockerfile
、docker-compose.yml
和 docker-swarm.yml
。他们每个人都有一个 CMD
和 ENTRYPOINT
指令。
正在启动 docker-compose
我可以检测到我的服务正在等待所需的服务(因为等待脚本)。如果我使用群模式,我会失败并且我的服务无法正常启动。
你能帮忙考虑一下生命周期吗?
有说明:
- CMD(docker 文件)
- 入口点(docker 文件)
- 入口点(docker-撰写)
- 命令(docker-撰写)
- 入口点(docker-群)
- 命令(docker-群)
是否可以得到不同场景下指定指令执行顺序的信息?
入口点和命令之间没有 "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。
我正在使用 docker 3.5
。在这个 docker 版本中,我在启动时遇到了节点依赖性问题。我尝试按照建议使用外部 sh
脚本应对 docker 文件来解决它。它导致更多的问题。例如`脚本存在但未检测到执行,已执行,但程序未启动。我的 docker-compose 已启动,但 swarm 模式失败等等...
我想我不清楚 Docker 生命周期。假设我们有 Dockerfile
、docker-compose.yml
和 docker-swarm.yml
。他们每个人都有一个 CMD
和 ENTRYPOINT
指令。
正在启动 docker-compose
我可以检测到我的服务正在等待所需的服务(因为等待脚本)。如果我使用群模式,我会失败并且我的服务无法正常启动。
你能帮忙考虑一下生命周期吗?
有说明:
- CMD(docker 文件)
- 入口点(docker 文件)
- 入口点(docker-撰写)
- 命令(docker-撰写)
- 入口点(docker-群)
- 命令(docker-群)
是否可以得到不同场景下指定指令执行顺序的信息?
入口点和命令之间没有 "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。