gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:52:03 24 4
gpt4 key购买 nike

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

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

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

您能否在考虑生命周期方面提供帮助?

有说明:

  • CMD( docker 文件)
  • ENTRYPOINT( docker 文件)
  • 入口点(docker-compose)
  • 命令(docker-compose)
  • 入口点(docker-swarm)
  • 命令(docker-swarm)

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

    最佳答案

    入口点和命令之间没有“执行顺序”,无论它是在镜像(Dockerfile)中定义还是在运行时被覆盖(使用compose file或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"来包装命令,更重要的是, -c arg到 /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 "$@"

    它将对进入点脚本(通常为CMD的值)运行任何cli参数,作为新的pid 1。

    关于docker - Dockerfile,docker-compose和swarm模式生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56328330/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com