【问题标题】:exited with code 0 docker以代码 0 退出
【发布时间】:2017-07-03 11:45:20
【问题描述】:

我正在尝试使用 docker-compose 服务启动容器。但不幸的是,容器退出时代码为 0。 容器的构建得益于来自 .tar.gz 存档的存储库。这个存档是一个 Centos 虚拟机。

我想从同一个存档中创建 6 个容器。 我不想输入 6 次 docker 命令,而是想创建一个 docker-compose.yml 文件,我可以在其中总结他们的命令和标签。

我已经开始编写 docker-compose.yml 文件,只是为了创建一个容器。

这是我的 docker-compose.yml :

version: '2'
services:
  dvpt:
   image: compose:test.1
   container_name: cubop1
   command: mkdir /root/essai/
   tty: true

不要注意命令,我只是指定一个。

所以我的问题是,为什么容器会退出?是否有另一种解决方案可以同时构建这些容器?

感谢您的回复。

【问题讨论】:

  • 你说不注意命令,但命令很重要,在这种情况下,容器将与命令一样存活。

标签: docker docker-compose boot2docker docker-machine


【解决方案1】:

答案实际上是第一条评论。我会稍微解释一下 Miguel 的评论。

首先,我们需要了解 Docker 容器运行单个命令。只要命令启动的进程正在运行,容器就会运行。一旦进程完成并退出,容器将停止。

有了这种理解,我们就可以对您的情况做出假设。当您启动dvpt 服务时,它会运行命令mkdir /root/essai/。该命令创建文件夹,然后退出。此时Docker容器停止,因为进程退出(状态为0,表示mkdir完成,没有错误)。

【讨论】:

  • -1 因为您没有给出正确的解决方案,所以就像评论中一样,只是一个解释本身。用可能的解决方案更新答案,我会改变主意。
  • 这个答案完全合理,准确地描述了问题。 mkdir 命令立即退出,成功或失败,导致容器立即退出。解决方案是不要使用 mkdir 作为入口点,这可以根据用例以多种方式完成。
  • 感谢安迪,你拯救了我的一天。就我而言,我刚刚在实际命令命令的末尾添加了长时间运行的命令: > bash -c "actual-command && tail -f /dev/null"
  • 由于原始问题没有给出任何他们想作为守护进程运行的命令,在这种情况下什么是一个很好的例子?
【解决方案2】:

你可以用 tail -f /dev/null 之类的命令结束

它经常在我的 docker-compose.yml 中使用

command: tail -f /dev/null

而且很容易看出我是如何保持容器运行的。

docker ps

【讨论】:

  • 真棒黑客。我想在容器中构建和编译 Go 程序,但我无法继续运行。这对我有用
【解决方案3】:

使用 -d 在后台运行 docker

$ docker-compose up -d

并在 docker-compose.yml 添加:

mydocker:
    tty: true

【讨论】:

  • 你能告诉我什么是tty吗?
  • 如果你的入口点是像bashsh这样的shell
  • 这就是答案。我认为 tty 是简短的“电传打字机”,实际上它只是指终端/命令行。
  • 知道为什么它在 OPs 案例中不起作用吗?
【解决方案4】:

我们遇到了一个问题,其中两个客户端服务 (vitejs) 以代码 0 退出。我添加了 tty: true 并且它开始工作。

dashboard:
    tty: true
    container_name: dashboard
    expose:
      - 8001
    image: tilt.dev/dashboard
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dashboard.tls=true"
      - "traefik.http.routers.dashboard.entrypoints=web"
      - "traefik.http.routers.dashboard-wss.tls=true"
      - "traefik.http.routers.dashboard-wss.entrypoints=wss"

【讨论】:

  • 它对我有用,谢谢
  • 仍然想知道 tty:true 是如何使它工作的,但它确实有效 :)
【解决方案5】:

一种解决方案是创建一个不会结束的进程、一个无限循环或可以在后台连续运行的东西。这将使容器保持打开状态,因为进程不会退出。

不过,这在很大程度上是一个 hack。我仍在寻找更好的解决方案。

Zend Server 映像执行类似的操作。在他们的 .sh 脚本中,他们有一个最终命令:

exec /usr/local/bin/nothing

执行一个在后台连续运行的文件。我试图在这里复制文件内容,但它必须是二进制的。

编辑: 你也可以用/bin/bash 结束你的文件,这会在容器中开始一个新的终端进程并防止它关闭。

【讨论】:

    【解决方案6】:

    创建一个 Dockerfile 并添加以下行以执行任何 shell 脚本或命令,而不会出现退出代码 0 错误。在你的情况下,它应该是

    RUN mkdir /root/essai/
    

    但是,使用下面的行来执行 shell 脚本

    RUN /<absolute_path_of_container>/demo.sh
    

    【讨论】:

      【解决方案7】:

      我知道我回答得太晚了,但几天前我也遇到了同样的问题,上面提到的一切都不起作用。真正的问题是在上面的答案中提到,docker在命令退出后停止。

      所以我为此做了一个 hack

      请注意,我使用 Dockerfile 创建映像,您可以按照以下方式进行操作,这只是一个示例。

      我使用 Supervisor 来监控流程。只要主管在监控 docker 容器也不会退出。

      对于那些也遇到同样问题的人,将做以下细化来解决问题:

      #1 在 Dockerfile 中安装 supervisor

      RUN apt-get install -y supervisor
      

      #2 像这样为主管创建一个配置文件(名为 supervisord.conf )

       [include]
      
      files = /etc/supervisor/conf.d/*.conf
      
      [program:app]
      
      command=bash
      
      #directory will be any folder where you wnat supervisor to cd before executing.
      directory=/project 
      
      autostart=true
      
      autorestart=true
      
      startretries=3
      
      #user will be anyone you want but make sure that user will have the enough privilage.
      
      user=root
      
      [supervisord]
      
      nodaemon=true
      
      
      
      [supervisorctl]
      
       

      #3 将supervisor conf文件复制到docker

      COPY supervisord.conf /etc/supervisord.conf
      

      #4 定义入口点

      ENTRYPOINT ["supervisord","-c","/etc/supervisord.conf"]
      

      现在只是构建文件并运行容器。它将保持容器运行。

      希望它可以帮助您解决问题。 快乐编码:-)

      【讨论】:

        【解决方案8】:

        可能是程序(来自 ENTRYPOINT/CMD)成功运行并退出(没有妖魔化自身)。因此,请检查 Dockerfile 中的 ENTRYPOINT/CMD。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-25
          • 2014-01-05
          • 2014-06-24
          • 2017-01-19
          • 1970-01-01
          • 2015-05-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多