Docker容器在退出shell时终止。

4

我正在运行一个由docker-compose up -d命令创建的基于Debian的Docker容器。它能够顺利启动并处理请求,但需要保持活跃的shell会话才能使容器继续运行。

我的docker-compose.yml文件如下:

services:
  db:
    image: postgres:alpine
    restart: always
    ports:
      - '5432:5432'    
    volumes:
      - /data/docker/postgresql/data:/var/lib/postgresql/data:Z
  pgadmin:
    image: dpage/pgadmin4:latest
    restart: always
    ports:
      - "5050:80"
    volumes:
      - /data/docker/postgresql/pgadmin-data:/var/lib/pgadmin:Z

每次我重启服务器,它似乎不会启动直到我登录。
根据systemctl status docker.service命令,Docker服务的状态如下:
 docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-08-09 22:37:46 -03; 21min ago
TriggeredBy:  docker.socket
       Docs: https://docs.docker.com
   Main PID: 4359 (dockerd)
      Tasks: 11
        CPU: 1.396s
     CGroup: /system.slice/docker.service
             └─4359 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

即使一切看起来很好,但我注销 shell 会话后,容器就停止运行了。

1
你需要一个前台进程,例如ENTRYPOINT ["tail", "-f", "/dev/null"]。 - Mate
我希望这可以帮助您:由Compose支持的Postgresql和pgadmin4 - Ali
@Mate,postgres:alpine和pgadmin4:latest都是为了作为服务运行而创建的镜像,它们都不需要额外的前台进程。 - strtCoding
@Ali,感谢你的仓库。就我所看到的,那里创建的yaml文件基本上与我的yaml文件当前正在执行的操作相同。 - strtCoding
1个回答

7

我遇到的问题可以搜索:

非root容器在用户会话结束时退出

我终于意识到我正在使用docker的非root配置,并且两个容器都是使用普通用户启动的,所以最终我解决了这个问题。

如果loginctl被配置为不使用lingering,则Linux会停止由普通用户启动的进程,以防止普通用户在系统中执行长时间运行的进程。

我找到了这个链接,对我很有帮助:17) rootless containers exit once the user session exits

您需要通过loginctl设置持久模式,以防止用户会话完成后杀死用户进程。

症状

一旦用户注销,所有容器就会退出。

解决方案

您将需要:

# loginctl enable-linger $UID

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接