如何在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服务是更高效的方式。
操作步骤
启动容器时挂载主机Docker套接字
启动Jenkins代理容器时,添加挂载参数让容器内的Docker客户端直接调用主机的Docker daemon:docker run -v /var/run/docker.sock:/var/run/docker.sock -d <你的代理镜像名>解决套接字权限问题
主机的/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
- 可以在Dockerfile末尾添加:
二、更优实现方案
方案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,但性能开销大且有安全风险,不推荐生产环境使用:
- 修改Dockerfile添加daemon配置:
FROM ubuntu:latest # 保留原有安装步骤... # 配置Docker daemon存储驱动 RUN mkdir -p /etc/docker RUN echo '{"storage-driver": "overlay2"}' > /etc/docker/daemon.json - 启动容器时开启特权模式:
docker run --privileged -d <你的代理镜像名> dockerd-entrypoint.sh
内容的提问来源于stack exchange,提问作者George Jose
相关产品推荐
相关产品推荐

