Alpine容器中以非Root用户运行Docker Compose权限问题求助
问题根源与解决方案
核心问题原因
构建阶段无法获取宿主机Docker套接字权限
Dockerfile中的RUN sh /docker-perms.sh是在镜像构建阶段执行的,此时宿主机的/var/run/docker.sock还未挂载到容器内,脚本里的if [ -S ${DOCKER_SOCKET} ]条件不成立,完全跳过了给jenkins用户添加Docker组权限的逻辑。所以镜像构建完成后,jenkins用户根本没有访问Docker套接字的权限。容器重启后权限丢失
即使手动在容器内运行脚本临时解决了权限问题,一旦容器重启,之前的权限配置会消失。而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
相关产品推荐
相关产品推荐

