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

如何在Ubuntu Docker容器中运行Docker作为Jenkins构建代理?

问题描述

我尝试在Ubuntu Docker容器中运行Docker,将其用作Jenkins的构建代理。执行docker build命令时遇到以下错误:

Jenkins中的错误

ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Docker构建代理的Dockerfile

FROM ubuntu:latest
RUN apt update

USER root

RUN apt install -y git

RUN apt-get install \
    ca-certificates \
    curl \
    gnupg -y

RUN mkdir -m 0755 -p /etc/apt/keyrings

RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg

RUN echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null

RUN apt-get update

RUN apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

RUN curl -fsSL https://deb.nodesource.com/setup_19.x | bash - &&\
apt-get install -y nodejs

流水线需求

该流水线需要完成以下步骤:

  • 克隆代码仓库
  • 构建React应用
  • 构建Docker镜像并推送到Docker镜像仓库

由于主机未安装必要工具,必须使用Docker构建代理,请问如何让这套环境正常运行?有没有更优的实现方案?


解决方案

一、修复现有代理容器的问题

错误原因是容器内的Docker客户端找不到可用的Docker守护进程。没必要在容器内单独启动daemon,直接复用主机的Docker服务是更高效的方式。

操作步骤

  1. 启动容器时挂载主机Docker套接字
    启动Jenkins代理容器时,添加挂载参数让容器内的Docker客户端直接调用主机的Docker daemon:

    docker run -v /var/run/docker.sock:/var/run/docker.sock -d <你的代理镜像名>
    
  2. 解决套接字权限问题
    主机的/var/run/docker.sock默认属于docker用户组,需要让容器内的Jenkins用户(或运行用户)拥有访问权限:

    • 可以在Dockerfile末尾添加:
      # 主机docker组GID通常为999,直接创建并添加用户
      RUN groupadd -g 999 docker
      RUN usermod -aG docker jenkins # 若容器用root用户运行可跳过此步
      
    • 或者启动时动态匹配主机的docker组GID:
      docker run -v /var/run/docker.sock:/var/run/docker.sock \
        -e DOCKER_GID=$(getent group docker | cut -d: -f3) \
        -d <你的代理镜像名>
      
      进入容器后执行:
      groupmod -g $DOCKER_GID docker
      usermod -aG docker jenkins
      

二、更优实现方案

方案1:基于官方Jenkins代理镜像构建

官方提供了预装基础环境的Jenkins代理镜像,在此基础上添加Docker客户端和Node.js即可,省去从零构建的麻烦:

FROM jenkins/inbound-agent:latest
USER root
# 安装Docker客户端
RUN apt-get update && apt-get install -y docker-ce-cli
# 安装Node.js 19.x
RUN curl -fsSL https://deb.nodesource.com/setup_19.x | bash - && apt-get install -y nodejs
USER jenkins

启动时同样挂载主机的/var/run/docker.sock,完全符合Jenkins的最佳实践。

方案2:Docker-in-Docker(DinD)模式(仅适合测试)

如果必须在容器内独立运行Docker daemon,可以使用DinD,但性能开销大且有安全风险,不推荐生产环境使用:

  1. 修改Dockerfile添加daemon配置:
    FROM ubuntu:latest
    # 保留原有安装步骤...
    # 配置Docker daemon存储驱动
    RUN mkdir -p /etc/docker
    RUN echo '{"storage-driver": "overlay2"}' > /etc/docker/daemon.json
    
  2. 启动容器时开启特权模式:
    docker run --privileged -d <你的代理镜像名> dockerd-entrypoint.sh
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:42:39