我想用docker-compose启动服务并保持容器运行,这样我就可以通过'docker inspect'获取其IP地址。但是,容器在启动后总是立即退出。
我试图将“command:[”sleep“,”60“]”和其他东西添加到docker-compose.yml但是每当我用“command:...”添加行时我都不能称之为“docker-撰写“因为我将收到消息”无法启动容器.....系统错误:无效字符'k'寻找值的开头“
我还尝试将“CMD sleep 60”添加到Dockerfile本身,但这些命令似乎没有被执行。
是否有一种简单的方法可以保持容器存活或解决我的一个问题?
编辑: 这是我想要运行的Compose文件:
version: '2'
services:
my-test:
image: ubuntu
command: bash -c "while true; do echo hello; sleep 2; done"
它工作正常如果我在OS X下使用docker-compose启动它,但是如果我在Ubuntu 16.04下尝试相同,它会给我上面的错误消息。
如果我尝试使用Dockerfile的方法,Dockerfile看起来像这样:
FROM ubuntu:latest
CMD ["sleep", "60"]
似乎没有做任何事情
编辑2: 我必须纠正自己,原来这是与Dockerfile和docker-compose.yml相同的问题: 每次我将“CMD ...”添加到Dockerfile或将“command ...”添加到compose文件时,我会在无效字符上面出现错误。如果我删除这两个命令,它可以完美地工作。
答案 0 :(得分:43)
要在使用docker-compose
启动容器时保持容器运行,请使用以下命令
command: tail -F anything
所以你的docker-compose.yml变成了
version: '2'
services:
my-test:
image: ubuntu
command: tail -F anything
您可以使用以下命令运行shell进入容器
docker exec -i -t composename_my-test_1 bash
其中composename
是docker-compose
添加到容器之前的名称。
答案 1 :(得分:25)
请参阅https://github.com/docker/compose/issues/1926#issuecomment-135068628
可以在docker-compose中使用command: tail -f /dev/null
来保持容器正常运行。
答案 2 :(得分:4)
msgs.msgs.frm: (fields.E304) Reverse accessor for 'msgs.frm' clashes with reverse accessor for 'msgs.to'.<br>
HINT: Add or change a related_name argument to the definition for 'msgs.frm' or 'msgs.to'.<br>
msgs.msgs.frm: (fields.E305) Reverse query name for 'msgs.frm' clashes with reverse query name for 'msgs.to'.<br>
HINT: Add or change a related_name argument to the definition for 'msgs.frm' or 'msgs.to'.<br>
msgs.msgs.to: (fields.E304) Reverse accessor for 'msgs.to' clashes with reverse accessor for 'msgs.frm'.<br>
HINT: Add or change a related_name argument to the definition for 'msgs.to' or 'msgs.frm'.<br>
msgs.msgs.to: (fields.E305) Reverse query name for 'msgs.to' clashes with reverse query name for 'msgs.frm'.<br>
HINT: Add or change a related_name argument to the definition for 'msgs.to' or 'msgs.frm'.<br>
的文件docker-compose.yml
version: "3"
services:
ubuntu:
image: ubuntu:latest
tty: true
docker-compose up -d
以获取容器ID或名称docker ps
docker inspect $container_id
或docker-compose exec ubuntu /bin/bash
的bash shell docker-compose exec ubuntu /bin/sh
答案 3 :(得分:2)
正如评论者所说,我们必须看到有问题的Dockerfile给你一个完整的答案,但这是一个非常常见的错误。我几乎可以保证您尝试运行的命令正在启动后台进程。这可能是你在非Docker情况下运行的命令,但在Dockerfile中做错了。例如,如果您运行的内容通常被定义为系统服务,则可以使用类似“systemctl start”的内容。那将在后台开始这个过程,这是行不通的。您必须在前台运行该过程,因此整个过程将被阻止。
答案 4 :(得分:2)
在Dockerfile中,您可以使用命令:
{CMD sleep infinity}
答案 5 :(得分:0)
您可以使用tty
配置选项。
version: '3'
services:
app:
image: node:8
tty: true
答案 6 :(得分:0)
快速笔记
我已经基于golang
测试了单个图像,因此,当我在这里致电docker-compose down
时,我会得到:
version: "3.1"
...
command: tail -f /dev/null # stopping container takes about 10 sec.
tty: true # stopping container takes about 2 sec.
我的系统信息:
Ubuntu 18.04.4 LTS (64-bit)
Docker version 19.03.6, build 369ce74a3c
docker-compose version 1.26.0, build d4451659
答案 7 :(得分:0)
这里有些人写到覆盖 entrypoint
以便 command
也能发挥作用。但是没有人举例。然后我:
docker-compose.yml
:
version: '3'
services:
etfwebapp:
# For messed up volumes and `sudo docker cp`:
command: "-f /dev/null"
entrypoint: /usr/bin/tail
tty: true
# ...
我不确定此时是否需要 tty
。做两次更好吗?就我而言,它没有害处,而且效果很好。没有 entrypoint
它对我不起作用,因为那时 command
没有效果。所以我想这个解决方案 tty
是可选的。
要了解启动时执行的命令,只需阅读 entrypoint
之前的 command
(用空格连接):/usr/bin/tail -f /dev/null
。
答案 8 :(得分:-3)
好的,我发现了我的错误。在用于撰写的图像的Dockerfile中,我指定基本图像应该是ubuntu:latest,但我之前创建了一个名为ubuntu的图像,并且该图像不起作用。所以我没有使用原始的ubuntu图像,而是使用我自己的图像的腐败版本,也称为ubuntu。