Docker 容器在 shell 注销时终止

str*_*ing 6 docker docker-compose

我正在运行一个docker-compose up -d使用独立命令创建的 debian 支持的 docker 容器。它启动时没有问题,并且服务请求也没有问题,但它要求我保持使用活动 shell 登录才能保持容器运行。

\n

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

\n
services:\n  db:\n    image: postgres:alpine\n    restart: always\n    ports:\n      - '5432:5432'    \n    volumes:\n      - /data/docker/postgresql/data:/var/lib/postgresql/data:Z\n  pgadmin:\n    image: dpage/pgadmin4:latest\n    restart: always\n    ports:\n      - "5050:80"\n    volumes:\n      - /data/docker/postgresql/pgadmin-data:/var/lib/pgadmin:Z\n
Run Code Online (Sandbox Code Playgroud)\n

每次我重新启动服务器时,它似乎都不会启动,直到我登录为止。

\n

docker 服务的状态如下systemctl status docker.service

\n
\xe2\x97\x8f docker.service - Docker Application Container Engine\n     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)\n     Active: active (running) since Tue 2022-08-09 22:37:46 -03; 21min ago\nTriggeredBy: \xe2\x97\x8f docker.socket\n       Docs: https://docs.docker.com\n   Main PID: 4359 (dockerd)\n      Tasks: 11\n        CPU: 1.396s\n     CGroup: /system.slice/docker.service\n             \xe2\x94\x94\xe2\x94\x804359 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

str*_*ing 10

我遇到的问题可以搜索:

一旦用户会话退出,无根容器就会退出

在意识到我正在使用 docker 的无根配置并且两个容器都开始使用普通用户后,我终于可以修复它了。

如果 loginctl 配置为不使用延迟,Linux 将停止普通用户启动的进程,以防止普通用户在系统中继续执行长时间运行的进程。

我发现这个链接有帮助:17)一旦用户会话退出,无根容器就会退出

您需要通过 loginctl 设置延迟模式,以防止用户会话完成后用户进程被终止。

症状

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

解决方案

您需要:

# loginctl enable-linger $UID
Run Code Online (Sandbox Code Playgroud)