当前位置: 首页 > 知识库问答 >
问题:

JenkinsPipeline不能与docker-compose一起运行,因为它无法连接到docker守护进程

毕黎昕
2023-03-14

我正在尝试构建一个docker映像,并在Jenkins管道中使用docker-compose启动容器。

我为我的 Jenkins 提供了一个自定义的 Docker 映像,我在其中使用 Jenkins 开箱即用的映像并安装 Docker CE 和 Docker 撰写。

Dockerfile:

FROM jenkins/jenkins:2.159

USER root

# create dir to save jenkins log files
RUN mkdir /var/log/jenkins
RUN chown -R jenkins:jenkins /var/log/jenkins

########################################################################################################################
## install docker based on: https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-debian-9
########################################################################################################################
RUN apt update
RUN apt -y install 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 update
# make sure you are about to install from the Docker repo instead of the default Debian repo
RUN apt-cache policy docker-ce
RUN apt -y install docker-ce
#RUN systemctl status docker

# give jenkins docker rights
RUN apt update
RUN apt-get install acl

#RUN ls /var/run
#RUN setfacl -m user:jenkins:rw /var/run/docker.sock

RUN usermod -aG docker jenkins
RUN gpasswd -a jenkins docker

################################################################################################################################
## install docker-compose based on: https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-debian-9
################################################################################################################################
RUN curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
RUN chmod +x /usr/local/bin/docker-compose
RUN docker-compose --version

USER jenkins

RUN id -nG

#tell jenkins to use the created folder to store logs

我使用docker compose build和此docker compose文件构建此图像:

version: '3'

volumes:
  jenkins-log:
  jenkins-data:

networks:
  jenkins-net:

services:
  master:
    build: ./jenkins-master
    ports:
      - "50000:50000"
    volumes:
      - jenkins-log:/var/log/jenkins
      - jenkins-data:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - jenkins-net

  nginx:
   build: ./jenkins-nginx
   ports:
      - "80:80"
   networks:
      - jenkins-net

并从docker-compose-p jenkins up-d开始

这开始了詹金斯,现在工作正常。

然后,我创建一个管道作业,该作业使用以下Jenkinsfile:

node {
    stage('Build Docker Image') {
        sh '''
            cd env-ci/
            docker-compose --version
            docker --version
            docker-compose build
        '''
    }
}

当我运行此管道时,我得到以下错误:

+ cd env-ci/
+ docker-compose --version
docker-compose version 1.22.0, build f46880fe
+ docker --version
Docker version 18.09.1, build 4c52b90
+ docker-compose build
Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

当我尝试在管道中运行docker info时:

node {
    stage('Build Docker Image') {
        sh '''
            cd env-ci/
            docker-compose --version
            docker --version
            docker info
        '''
    }
}

我得到以下错误:

+ cd env-ci/
+ docker-compose --version
docker-compose version 1.22.0, build f46880fe
+ docker --version
Docker version 18.09.1, build 4c52b90
+ docker info
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/info: dial unix /var/run/docker.sock: connect: permission denied

我目前不知道问题是什么或者如何解决它。Jenkins管道以用户jenkins的身份运行,并且该用户被添加到docker组中。所以权限应该没问题?!

有没有人知道可能出了什么问题?谢谢!

共有3个答案

邓阳嘉
2023-03-14

尝试在主机上运行此命令,但这只是一种解决方法:chmod 777 /var/run/docker.sock这将允许任何人连接到docker守护进程,包括jenkins进程

闾丘文昌
2023-03-14

大多数人面临< code >无法连接到Docker守护程序的问题,因为他们不是< code>docker组的成员,并且没有读取该文件的权限。< br >使用< code>sudo docker运行可以解决这个问题,但这不是一个合适的解决方案。

Docker可以作为具有适当组权限的非root用户(不带sudo)运行。Linux安装后文档有详细信息。
这是简短版本:

$ sudo groupadd docker

$ sudo usermod -aG docker $USER
# Log out and log back in again to apply the groups

$ groups  # docker should be in the list of groups for your user

$ docker run hello-world  # Works without sudo

这将向 docker 组中的用户授予在没有 sudo 的情况下运行 dockerdocker 撰写命令的权限。

允许jenkins使用:chown-jenkins:docker/var/run/docker.sock

梁池暝
2023-03-14

显然,权限存在问题,因为它是泊坞中的泊坞窗。我可以通过以下方式解决它:

1)从主机系统:以root身份连接到正在运行的jenkins容器

docker exec -u root -it <containerid> bin/bash

2)给予jenkins用户 /var/run/docker.sock

chown jenkins:docker /var/run/docker.sock

现在我可以用Jenkinsfile成功地运行管道了。但这并没有真正解决问题,因为每个映像构建后都需要执行chown步骤。

编辑:解决这个问题的简单方法是使用带有Docker代理的Jenkins从属(工作者)。这在本https://engineering.riotgames.com/news/building-jenkins-inside-ephemeral-docker-container中有所描述

 类似资料:
  • 我正在运行安装了以下docker软件的Ubuntu:

  • 我创建了一个Dockerfile来在Docker中运行Docker: 启动容器并运行docker ps后,我得到:“无法连接到unix:///var/run/docker.sock.docker守护程序是否正在运行?" 我在容器中执行了命令dockerd,结果是: 启动守护程序时出错:初始化网络控制器时出错:获取控制器实例时出错:未能创建NAT链DOCKER:iptables失败:iptables

  • 我在高山基地docker容器上遇到这个错误:“无法连接到unix://var/run/docker.sock.docker守护进程正在运行吗?”当我运行下面的命令:docker图像时,我使用下面的docker-comple: 这是我的dockerFile: 当我用这个命令运行容器时,它的ok docker run-ti-v /var/run/docker.sock:/var/run/docker.

  • 问题内容: 我创建了一个Dockerfile在Docker内部运行Docker: 启动容器并运行docker ps后,我得到:“无法通过unix:///var/run/docker.sock连接到Docker守护程序。Docker守护程序正在运行吗?” 我在容器内执行了命令dockerd: 错误启动守护程序:错误初始化网络控制器:错误获取控制器实例:无法创建NAT链DOCKER:iptables失

  • 我是docker的新手,在这里还没有找到一个问题来回答我遇到的问题。 我正在尝试使用Pycharm运行dockerfile,以便调试docker中的特定程序。我在pycharm中打开了dockerfile,并创建了运行dockerfile的配置。运行程序会在“服务”选项卡下显示错误消息: 在我搜索了这个问题之后,我发现了这个线程:无法连接到unix上的Docker守护程序:/var/run/Doc

  • 问题内容: 我想迁移到Docker,所以我才刚开始使用它。我已经在VirtualBox Ubuntu 15.10(Wily Werewolf)安装上安装了Docker,然后按照此处的建议,我尝试运行基本的nginx Docker映像: 因此,我检查了Docker是否正在运行: 这表明Docker守护程序实际上已经在运行,但是请确保我只是手动启动了Docker守护程序: 然后,我尝试再次运行该映像,