Docker Compose保持容器运行

时间:2016-07-23 21:56:20

标签: docker docker-compose

我想用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文件时,我会在无效字符上面出现错误。如果我删除这两个命令,它可以完美地工作。

9 个答案:

答案 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

其中composenamedocker-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_iddocker-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。