You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 14:56:00