退出代码 0 docker

exited with code 0 docker

我正在尝试使用 docker-compose services.But 启动容器,不幸的是,容器退出代码为 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

不用关注命令,我只指定一个。

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

感谢您的回复。

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

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

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

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

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

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

exec /usr/local/bin/nothing

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

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

你可以用tail -f这样的命令结束/dev/null

它经常在我的 docker-compose.yml 和

中使用

command: tail -f /dev/null

很容易看出我是如何保存容器的运行。

docker ps

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

RUN mkdir /root/essai/

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

RUN /<absolute_path_of_container>/demo.sh

运行 您的 docker 在后台使用 -d

$ docker-compose up -d

并在 docker-compose.yml 添加:

mydocker:
    tty: true

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

所以我为此做了一些修改

注意我已经使用 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"]

就是这样,现在只需构建文件和 运行 容器。它将保持容器 运行ning.

希望对您解决问题有所帮助。 快乐编码:-)

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

可能是程序(来自 ENTRYPOINT/CMD)运行 成功退出(没有妖魔化自己)。所以在 Dockerfile 中检查你的 ENTRYPOINT/CMD。