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

Alpine容器中以非Root用户运行Docker Compose权限问题求助

问题根源与解决方案

核心问题原因

  1. 构建阶段无法获取宿主机Docker套接字权限
    Dockerfile中的RUN sh /docker-perms.sh是在镜像构建阶段执行的,此时宿主机的/var/run/docker.sock还未挂载到容器内,脚本里的if [ -S ${DOCKER_SOCKET} ]条件不成立,完全跳过了给jenkins用户添加Docker组权限的逻辑。所以镜像构建完成后,jenkins用户根本没有访问Docker套接字的权限。

  2. 容器重启后权限丢失
    即使手动在容器内运行脚本临时解决了权限问题,一旦容器重启,之前的权限配置会消失。而Jenkins控制器执行任务时,可能对应容器重启后的状态,或者任务执行的用户上下文未获得正确权限,导致再次报错。

修复方案

修改Dockerfile,将权限配置移到容器启动阶段

把权限脚本的执行从构建阶段改为容器启动时自动执行,此时宿主机的Docker套接字已经挂载,脚本可以正确获取套接字的GID并配置权限。

修改后的Dockerfile:

FROM docker.io/jenkins/ssh-agent:4.4.0-alpine-jdk17

# SSH public key
ENV JENKINS_AGENT_SSH_PUBKEY "ssh-key"

# Install Docker CLI
RUN apk add --no-cache docker-cli docker-cli-compose

# 添加权限脚本并赋予执行权限,删除冲突的ping组
COPY docker-perms.sh /docker-perms.sh
RUN chmod +x /docker-perms.sh && delgroup ping

# 调整入口点:先执行权限配置脚本,再启动SSH agent服务
ENTRYPOINT ["/bin/sh", "-c", "/docker-perms.sh && /usr/local/bin/run-ssh-agent.sh"]

验证脚本逻辑

确保docker-perms.sh脚本的逻辑正确,特别是:

  • 检测到挂载的/var/run/docker.sock后,获取其所属组的GID
  • 要么将jenkins用户添加到已存在的对应组,要么新建匹配GID的docker组再添加用户

启动容器的挂载命令

确认启动容器时正确挂载宿主机Docker套接字:

docker run -v /var/run/docker.sock:/var/run/docker.sock [其他参数] <你的镜像名>

这样配置后,每次容器启动都会自动完成权限配置,jenkins用户无论是直接在容器内执行docker ps,还是通过Jenkins控制器执行任务,都能获得正确的Docker访问权限。

内容的提问来源于stack exchange,提问作者Specimen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:20:27