演示分离容器和非分离容器之间的区别

Demonstrating the difference between detached and not detached containers

我有一个非常简单的docker文件:

FROM alpine:3.14 AS build

LABEL version = "1.0"
LABEL description = "Our first Docker file!"

和一个非常简单的 docker-compose.yml 文件:

version: "3.9"

# Define services
services:
    container1:
        container_name: first_container
        build:
            context: .
            dockerfile: dockerfile

我正在 运行 使用 docker-compose up 编写 docker-compose 文件,或者 docker-compose up -d 以证明容器仍然 运行ning在分离配置中。

在第一种情况下,我希望容器 运行 然后关闭。确实如此。 运行 docker-compose down 然后停止并移除所有容器 (first_container),如 docker-compose ps.

确认
$ docker-compose up
Creating network "comdockerdevenvironmentscode_default" with the default driver
Creating first_container ... done
Attaching to first_container
first_container exited with code 0

$ docker-compose ps
     Name         Command   State    Ports
------------------------------------------
first_container   /bin/sh   Exit 0        

$ docker-compose down
Removing first_container ... done
Removing network comdockerdevenvironmentscode_default

$ docker-compose ps
Name   Command   State   Ports
------------------------------

现在,我重新运行 docker-重新组合,添加分离的命令。现在,输出表明它创建了容器,但没有关闭它。伟大的!当 运行ning docker-compose ps 时我应该看到状态变化,但它似乎仍然已经退出。

$ docker-compose up -d
Creating network "comdockerdevenvironmentscode_default" with the default driver
Creating first_container ... done

$ docker-compose ps
     Name         Command   State    Ports
------------------------------------------
first_container   /bin/sh   Exit 0        

这是为什么?我怎样才能证明我可以附加到 运行ning 分离容器,但不能附加到另一种情况下的封闭容器?

alpine 容器,没有相反的显式配置,默认启动 shell (/bin/sh)。如果 stdin 未打开,shell 会立即退出。无论您是否 运行 docker-compose up-d,在所有情况下 stdin 都会关闭,因此您的容器会退出。

如果你想让容器运行一个shell不退出,那么你需要安排到stdin保持连接。要获得提示,您还需要 Docker 分配一个 tty。这意味着:

version: "3.9"

services:
    container1:
        image: docker.io/alpine:latest
        stdin_open: true
        tty: true

运行 上面示例中的容器意味着您可以 docker attach 访问它并访问 shell 提示符。

或者,如果您希望容器 运行 不退出,只需 运行 一个不会退出的命令:

version: "3.9"

services:
    container1:
        image: docker.io/alpine:latest
        command: [sleep, inf]

此 运行 是 sleep inf 命令,运行 直到被取消。一个更典型的例子是 运行 某种持久性服务,如网络服务器、数据库等。