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

Ubuntu Jenkins Docker代理挂载Docker Daemon时权限拒绝问题求助

问题描述

我使用以下Dockerfile构建容器代理镜像:

FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

RUN groupadd -g 999 docker

# Install Docker CLI
RUN apt-get update && apt-get install -y docker.io

# Install OpenJDK, Git, and other build tools
RUN apt-get install -y openjdk-17-jdk git wget

RUN wget https://mirrors.estointernet.in/apache/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz
RUN tar -xvf apache-maven-3.8.5-bin.tar.gz
RUN mv apache-maven-3.8.5 /opt/

ENV M2_HOME='/opt/apache-maven-3.8.5'
ENV PATH="$M2_HOME/bin:$PATH"

# Set up your user and workspace

RUN useradd -m -u 1005 -g 999 -s /bin/bash jenkins

USER jenkins
WORKDIR /home/jenkins/agent

对应的Jenkins Pipeline配置如下(其中1005是Jenkins用户ID,999是预设的Docker组ID):

pipeline {
agent { docker {
    image 'my docker img'
    args '-u 1005:999 -v /var/run/docker.sock:/var/run/docker.sock --entrypoint=""'
    registryCredentialsId 'hubdocker'
    alwaysPull true
 } }

stages {
   stage('Print User and Groups') {
        steps {
            script {
                // Print current user
                sh 'id'
            }
        }
    }
    ...

    stage('docker build') {
        steps {
            sh 'docker build -t myregistrery/test1 .'
        }
    }
}

执行id命令后,容器内用户信息与主机一致:

uid=1005(jenkins) gid=999(docker) groups=999(docker)

但在容器内查看挂载的/var/run/docker.sock权限时,结果显示:

srw-rw---- 1 65534 65534

目前容器内执行docker ps、docker build等命令均会触发权限拒绝错误,示例如下:

docker build -t myregistrery/test1 .
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=jplamondon%2Ftest1&target=&ulimits=null&version=1": dial unix /var/run/docker.sock: connect: permission denied

直接在终端运行该容器代理也能复现此问题,需要找到无需修改主机docker.sock权限的解决方法。

解决方法

方法1:动态匹配主机Docker组ID

容器内预设的docker组ID(999)大概率和主机实际的Docker组ID不匹配,这是权限失效的核心原因。可以在容器启动时动态调整组ID:

  • 修改Jenkins Pipeline的args参数,在启动时先调整docker组GID匹配主机的,再进入工作环境:
args '-u 1005 -v /var/run/docker.sock:/var/run/docker.sock --entrypoint="sh" -c "groupmod -g $(stat -c %g /var/run/docker.sock) docker && exec /bin/bash"'

这条命令会读取挂载的docker.sock所属组ID,修改容器内docker组的GID,确保和主机一致。

方法2:构建镜像时传入主机Docker组ID

在构建镜像阶段就同步主机的Docker组ID,避免固定值不匹配:

  1. 先在主机上获取真实的Docker组ID:
DOCKER_GID=$(getent group docker | cut -d: -f3)
  1. 构建镜像时通过--build-arg传入该值:
docker build --build-arg DOCKER_GID=$DOCKER_GID -t my-docker-img .
  1. 修改Dockerfile中的组创建逻辑,使用传入的参数:
ARG DEBIAN_FRONTEND=noninteractive
ARG DOCKER_GID=999  # 设默认值防止无参数时出错

RUN groupadd -g $DOCKER_GID docker
# 其余原有命令保持不变...

方法3:临时使用sudo提权(应急方案)

如果上述方法暂时无法实施,可通过sudo临时提权:

  • 在Dockerfile中添加sudo安装和权限配置:
RUN apt-get install -y sudo && echo "jenkins ALL=(ALL) NOPASSWD: /usr/bin/docker" >> /etc/sudoers
  • 在Pipeline中执行docker命令时添加sudo前缀:
sh 'sudo docker build -t myregistrery/test1 .'

注意:此方法会扩大容器内用户权限,非必要不推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:20:03