gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:58:04 26 4
gpt4 key购买 nike

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

我的 Jenkins 有一个自定义的 docker 镜像,我在其中使用 Jenkins 开箱即用的镜像并安装 Docker CE 和 docker compose。

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 开始

这将启动 Jenkins 并且现在工作正常。

然后我创建了一个使用以下 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 组。所以权限应该没问题吧?!

有谁知道可能有什么问题?
谢谢!

最佳答案

显然权限有问题,因为它是 docker 中的 docker。我可以用以下方法解决它:

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 Slave(worker)。这在这个 turotial 中描述
https://engineering.riotgames.com/news/building-jenkins-inside-ephemeral-docker-container

关于docker - Jenkins Pipeline 不能与 docker-compose 一起运行,因为它无法连接到 docker 守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54232842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com