GitLab自定义Podman Runner执行CI成功后容器与Pod自动消失问题求助
问题原因
- 核心原因:你使用的GitLab Runner Docker执行器默认开启了作业结束资源清理机制,所有作业运行过程中创建的、带有对应作业标识标签的容器、Pod资源,都会在作业完成后被Runner统一删除,哪怕你挂载了宿主机的Podman sock,创建的资源也会被识别为作业关联资源清理。
- 次要原因1:当前CI脚本中的
podman run命令末尾添加了top参数,会覆盖Dockerfile中定义的npm run start启动指令,就算容器不被删除,运行的也不是目标前端服务。 - 次要原因2:Docker执行器默认的隔离机制,可能导致你创建的Pod被绑定到作业的网络命名空间,作业结束后命名空间销毁,连带Pod被删除。
解决方案
方案一:切换为Shell执行器(推荐)
直接让Runner的命令在宿主机上执行,完全绕过Docker执行器的清理机制,操作步骤:
- 重新注册Runner,修改executor类型为shell:
gitlab-runner register --non-interactive \ --name "sdx-runner" \ --url "https://gitlab.mycompany.com/" \ --registration-token "jghfcZXXqZB-xJ-hfgL" \ --executor shell \ --tag-list "sdx-runner-pod"
- 给gitlab-runner用户添加Podman执行权限,避免权限不足问题:
usermod -aG podman gitlab-runner systemctl restart gitlab-runner
- 修改
.gitlab-ci.yml中的deploy作业脚本,删掉多余的top参数,同时添加旧资源清理逻辑避免重复创建报错:
deploy: stage: deploy script: - cd client - podman build -t lm-client-dev . - podman pod rm -f lm-dev || true - podman run -d --pod new:lm-dev -p 4250:3000 lm-client-dev tags: - sdx-runner-pod
方案二:保留Docker执行器,修改配置关闭清理
如果必须使用Docker执行器,按以下步骤修改:
- 打开Runner配置文件
/etc/gitlab-runner/config.toml,找到对应Runner的配置块,添加以下参数:
[runners.docker] rm = false cleanup_containers = false # 原有其他配置保持不变
- 修改CI脚本中的Pod/容器创建命令,添加空的作业ID标签避免被清理机制识别,同时删掉多余的top参数:
podman run -d --pod new:lm-dev -p 4250:3000 --label "gitlab-runner.job.id=" lm-client-dev
- 重启GitLab Runner服务生效:
systemctl restart gitlab-runner
验证方法
CI作业运行完成后,登录宿主机执行以下命令确认资源正常:
- 查看Pod状态:
podman pod ls,确认lm-dev Pod处于Running状态 - 查看容器状态:
podman ps,确认lm-client-dev容器正常运行 - 验证服务可访问:
curl http://localhost:4250,能拿到前端页面返回即正常
内容的提问来源于stack exchange,提问作者Iman
相关产品推荐
相关产品推荐

