在流程执行后停止的Detached模式中启动的docker容器

时间:2015-03-16 21:18:28

标签: linux docker

我使用以下命令在分离模式下创建docker容器:

docker run [OPTIONS] --name="my_image" -d container_name /bin/bash -c "/opt/init.sh"

所以我需要在创建容器时执行“/opt/init.sh”。我看到脚本完成执行后容器停止了。

如何在容器创建时使用脚本/服务执行将容器保持分离状态?

2 个答案:

答案 0 :(得分:3)

有两种运行泊坞容器的模式

  1. 分离模式 - 此模式执行命令并在命令完成后终止容器
  2. 前台模式 - 此模式运行bash shell,但也会在退出shell后终止容器
  3. 您需要的是背景模式。参数中没有给出这一点,但有很多方法可以做到这一点。

    1. 在分离模式下运行无限命令,因此命令永远不会结束,容器永远不会停止。我通常只使用“tail -f / dev / null”,因为它的重量很轻,大多数linux映像中都存在/ dev / null
    2.   

      docker run -d --name = name container tail -f / dev / null

      然后你可以像这样闯入运行容器:

        

      docker exec -it name / bin / bash -l <​​/ p>

      如果使用-l参数,它将以登录模式登录,这将执行.bashrc,就像正常的bash登录一样。否则,你需要手动再次打击

      1. 入口点 - 您可以创建任何sh脚本,例如/entrypoint.sh。在entrypoint.sh中,你也可以运行任何永不停止的脚本
      2.   

        #!/ bin / sh的

             

        #/ entrypoint.sh

             

        service mysql restart

             

        ...

             

        tail -f / dev / null&lt; - 这永远不会结束

        保存此entrypoint.sh后,chmod a + x,退出docker bash,然后按以下方式启动:

          

        docker run --name = name container --entrypoint /entrypoint.sh

        这允许每个容器都有自己的启动脚本,您可以运行它们而无需担心每次都附加启动脚本

答案 1 :(得分:0)

Docker容器将在其主进程结束时退出。在这种情况下,这意味着init.sh何时结束。如果您只是尝试启动单个应用程序,则可以使用exec在最后启动它,确保在前台运行它。使用exec将有效地将被调用的服务/应用程序转换为主进程。

如果您要启动多项服务,最好使用supervisordrunit等流程管理器。您需要在前台启动进程管理器守护程序。 Docker文档包含example of using supervisord