尝试 运行 docker-compose 的 archlinux 映像,但它只是以代码 0 退出

Trying to run archlinux image of docker-compose but its just exits with code 0

我正在尝试启动 archlinux 映像,然后添加卷,这样我就可以测试我的脚本来配置 Arch Linux。但我坚持开始撰写。如果我重新启动:总是在我注释掉它时它总是重新启动,然后它给我退出代码 0.

version: "3.7"

services:
  arch:
    image: archlinux/base
    # restart: always

我开始创作

$docker-compose up

输出为

Creating network "docker-compose_default" with the default driver
Creating docker-compose_arch_1 ... done
Attaching to docker-compose_arch_1
docker-compose_arch_1 exited with code 0

可能缺少什么?

非常感谢任何帮助。我被这个问题困扰了很长一段时间。

因为 archlinux 有 CMD[/usr/bin/bash] https://github.com/archlinux/archlinux-docker/blob/master/Dockerfile 这意味着你必须指定任何长 运行 任务来让容器 运行 否则它会退出例如你可以通过bash 的参数,例如 while 循环以保持它 运行.

version: "3.7"

services:
  arch:
    image: archlinux/base
    command:
     - "while(true); do sleep 5; done"

您目前正在使用的基本映像 executes /usr/bin/bash as a default command 需要分配一个 tty 以保持 运行ning(或者您必须将命令更改为任意长 运行宁任务).

首先看看 docker 本身会发生什么。

以交互方式启动容器按预期工作:

$ docker run -it --rm archlinux/base
[root@6642c519e328 /]# more /etc/issue 
Arch Linux \r (\l)

[root@6642c519e328 /]# exit

现在让我们尝试运行一个容器在后台:

$ docker run -d --name testarch archlinux/base
915ff11b0c93bd795eb62d37cd2d9928638560d9accfb2e5ba061b3ef19c0235
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ # Hoho, it's not running
$ docker ps -a
CONTAINER ID        IMAGE                                               COMMAND                 CREATED             STATUS                     PORTS               NAMES
915ff11b0c93        archlinux/base                                      "/usr/bin/bash"         8 seconds ago       Exited (0) 7 seconds ago                       testarch
$ docker rm testarch 
testarch

如果我们对 tty 分配做同样的事情:

$ docker run -d --tty --name testarch archlinux/base
d160a3d7e18c3d094f47577b448a11808eb30ce7ba8fad4cde882818f248f207
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d160a3d7e18c        archlinux/base      "/usr/bin/bash"     5 seconds ago       Up 4 seconds                            testarch
$ # Tada ! It runs, we can now attach to it.
$ docker exec -it testarch bash
[root@d160a3d7e18c /]# more /etc/issue
Arch Linux \r (\l)

[root@d160a3d7e18c /]# exit
$ docker rm -f testarch

现在回到你的docker-compose.yml。在您当前的测试阶段,您需要分配一个 tty(如果您 cmd/entry-point 不再需要它,您可以稍后删除)。

version: "3.7"

services:
  arch:
    image: archlinux/base
    tty: true

目前,bash 命令没有在容器日志中发送任何内容。我将以分离模式启动,所以命令 returns 一旦容器启动,我就可以使用同一个终端(启动第二个终端,如果你仍然想 运行 docker-compose in前景模式)

$ pwd
/tmp/slack_test
$ docker-compose up -d
Creating network "slack_test_default" with the default driver
Creating slack_test_arch_1 ... done
$ docker-compose exec arch bash
[root@10f138d98782 /]# more /etc/issue 
Arch Linux \r (\l)

[root@10f138d98782 /]# exit
exit
$ docker-compose down
Stopping slack_test_arch_1 ... done
Removing slack_test_arch_1 ... done
Removing network slack_test_default
$