Ubuntu 24下root权限GitLab Runner启动的Podman Nginx容器无法停止
解决root权限下Podman运行Nginx容器无法停止的僵尸进程问题
在Ubuntu 24(Noble)系统中,以root权限通过GitLab Runner或直接使用podman-compose运行Nginx容器时,执行podman-compose down后容器无法正常停止,残留僵尸进程且无法强制删除;但以普通用户身份运行Podman时无此问题。以下是针对性解决策略:
1. 调整容器停止信号与启动命令
Rootful模式下,Podman的cgroup管理可能导致信号传递异常,明确指定Nginx的停止信号并确保进程前台运行:
修改docker-compose.yaml,添加停止信号并显式声明启动命令:
version: "3" services: frontend: build: context: . dockerfile: Dockerfile ports: - "127.0.0.1:80:80" expose: - "80" stop_signal: SIGQUIT # 指定Nginx默认优雅停止信号 command: ["nginx", "-g", "daemon off;"] # 强制前台运行,确保信号能传递到主进程
测试时可手动发送信号验证:
sudo podman kill -s SIGQUIT <container-id>
2. 改用Rootless Podman运行GitLab Runner
既然普通用户模式无异常,将GitLab Runner配置为以普通用户身份运行Rootless Podman:
配置步骤:
- 创建专门的Runner用户:
sudo useradd -m gitlab-runner - 切换到该用户并初始化Rootless Podman:
su - gitlab-runner podman system migrate loginctl enable-linger gitlab-runner # 保持用户级systemd服务后台运行 - 修改GitLab Runner的
config.toml(通常位于/etc/gitlab-runner/config.toml),指定Podman作为运行时:[[runners]] name = "rootless-podman-runner" url = "https://your-gitlab-instance.com/" token = "your-runner-token" executor = "docker" [runners.docker] image = "alpine:latest" runtime = "podman" # 用Podman替代Docker运行时 volumes = ["/cache", "/run/user/$(id -u gitlab-runner)/podman/podman.sock:/var/run/docker.sock"] [runners.cache] [runners.cache.s3] [runners.cache.gcs] - 重启GitLab Runner服务:
sudo systemctl restart gitlab-runner
3. 更新Podman与Podman-Compose到最新版本
旧版本的Podman或podman-compose在Rootful模式下可能存在容器停止的兼容性bug,执行升级:
sudo apt update && sudo apt install --only-upgrade podman podman-compose
若通过pip安装podman-compose,执行:
sudo pip install --upgrade podman-compose
4. 应急清理残留进程与容器
若容器已处于无法停止的状态,可通过以下方式强制清理:
- 重启Podman服务重置容器状态:
sudo systemctl restart podman - 清理僵尸进程(需定位父进程PID):
# 查找僵尸进程的父进程ID sudo ps -o ppid= -p $(sudo ps aux | grep 'Z' | grep nginx | awk '{print $2}') # 终止父进程完成清理 sudo kill -9 <parent-pid>
内容的提问来源于stack exchange,提问作者Snake707
相关产品推荐
相关产品推荐

