我试图使用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
不要注意命令,因为我只需指定一个命令。
所以我的问题是,为什么容器正在退出?还有另一种解决方案可以同时构建这些容器吗?
感谢您的回复。
答案 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"]
现在它只需构建文件并运行容器。它将保持容器运行。
希望它可以帮助您解决问题。 和快乐的编码:-)