退出代码0 docker

时间:2017-07-03 11:45:21

标签: docker docker-compose boot2docker docker-machine

我试图使用docker-compose服务启动容器。但不幸的是,容器退出了代码0 。 由于存储库来自.tar.gz存档,因此构建容器。此存档是Centos VM。

我想从同一档案中创建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

不要注意命令,因为我只需指定一个命令。

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

感谢您的回复。

7 个答案:

答案 0 :(得分:19)

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

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

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

答案 1 :(得分:7)

使用-d在后台运行docker

$ docker-compose up -d

并在docker-compose.yml上添加:

mydocker:
    tty: true

答案 2 :(得分:2)

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

但这非常黑客。我仍在寻找更好的解决方案。

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

exec /usr/local/bin/nothing

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

编辑: 您还可以使用/bin/bash结束文件,该文件在容器中开始新的终端进程并使其不会关闭。

答案 3 :(得分:1)

我们遇到了一个问题,其中两个客户端服务 (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"

答案 4 :(得分:0)

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

它通常在

的docker-compose.yml中起作用

command: tail -f /dev/null

很容易看出我如何保持容器运行。

docker ps

答案 5 :(得分:0)

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

RUN mkdir /root/essai/

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

RUN /<absolute_path_of_container>/demo.sh

答案 6 :(得分:0)

我知道我为时已晚,但是几天前我也遇到了同样的问题,上面提到的所有内容都无法正常工作。真正的问题是如上面的答案所述,泊坞窗在命令退出后停止。

所以我为此做了黑客

请注意,我已使用Dockerfile创建映像,您可以按照以下方式进行操作。

我使用了主管来监视该过程。只要主管正在监视docker容器也不会退出。

对于那些也遇到相同问题的人,请执行以下步骤来解决该问题:

#1在Dockerfile中安装主管

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将超级用户conf文件复制到docker

COPY supervisord.conf /etc/supervisord.conf

#4定义一个入口点

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

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

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