退出代码 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。
我正在尝试使用 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。