Jenkins Docker容器无法访问docker.sock

6
我使用docker-compose部署了标准的Jenkins Docker镜像,并使用以下配置:
deployer:
  image: jenkins
  volumes:
    - "/mnt/jenkins:/var/jenkins_home"
    - "/var/run/docker.sock:/var/run/docker.sock"
  ports:
    - "2375:2375"
    - "8080:8080"
    - "50000:50000"

在阅读了许多SO问题后,我测试了将Root添加到docker用户组中的方法,使用命令 gpasswd -a ${USER} docker 并验证容器内的用户为Root,使用命令 docker exec jenkins_deployer echo ${USER}

当我尝试在Jenkins UI中添加Docker访问权限,设置"Docker URL = unix:///var/run/docker.sock"时,出现以下错误信息:“org.newsclub.net.unix.AFUNIXSocketException: Permission denied (socket: /run/docker.sock)”。

如何给Jenkins访问docker.sock的权限以自动部署Docker容器?


2
你的容器里安装了Docker吗?此外,你需要将主机系统中的Docker套接字共享/挂载到Jenkins容器中。个人而言,我不喜欢Docker-in-Docker的方法,因为它们感觉很不正规...我更喜欢将我的Jenkins主容器连接到一个已安装Docker的从容器,然后将所有Docker任务委派给该从容器。 - fishi0x01
我已从Web GUI中安装了Docker插件,因此它应该具备与 Docker Socket 进行交互所需的所有依赖(我猜是这样?)。您如何将docker任务委派给slave呢?我想在运行Jenkins容器的主机系统中部署新容器,因此必须在某个地方建立主机Docker API和触发部署的容器之间的连接。 - trahloff
你成功运行了吗,@trahloff? - Max Schindler
@MaxSchindler 很遗憾,不是的。 - trahloff
你尝试过在部署服务中添加 privileged: truenetwork_mode: host 选项吗?当尝试共享 Docker 套接字时,我偶尔需要其中一个或两个选项。此外,您可能需要确保您的 jenkins 用户有权限访问 /var/run/docker.sock。默认情况下,即使使用 root 用户启动服务,Jenkins 也不会以 root 用户身份运行。 - Nick Settje
显示剩余2条评论
1个回答

5
我知道我晚了两年,但我遇到了同样的问题,如果有这个解决方案,将会节省我几个小时的工作时间。
所以我需要部署一个Jenkins容器,它可以自动部署Docker容器。以下是我用来构建和运行的文件:
Dockerfile
FROM jenkins/jenkins:latest

USER root
RUN apt-get update -qq \
    && apt-get install -qqy apt-transport-https ca-certificates curl gnupg2 software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
  "deb [arch=amd64] https://download.docker.com/linux/debian \
  $(lsb_release -cs) \
  stable"
RUN apt-get update  -qq \
    && apt-get install docker-ce=17.12.1~ce-0~debian -y

RUN usermod -aG docker jenkins

docker-compose.yml

version: '3'

services:
  jenkins:
    container_name: 'jenkins-container'
    privileged: true
    build: .
    ports:
      - '8080:8080'
      - '50000:50000'
    volumes:
      - jenkins-data:/var/jenkins_home
    restart: unless-stopped

volumes:
  jenkins-data:

然后,在这些文件所在的文件夹中运行以下命令:

docker-compose up

当容器启动时,使用以下命令在其中启动Docker:

docker exec -it --user root <CONTAINER_ID>

service docker start

完成了!也许有一些更加优化的解决方案,但是现在这个对我来说已经很好了。

你现在可以在浏览器中访问<YOUR_IP>:8080来访问全新的Jenkins并且可以运行Docker容器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接