我正在尝试构建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文件的docker-compose build
构建此映像:
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组。所以权限应该可以吗?!
有人知道什么可能是错的吗? 谢谢!
答案 0 :(得分:0)
显然是权限存在问题,因为它是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 步骤。
编辑: 解决此问题的干净方法是将Jenkins Slave(工作者)与Docker代理一起使用。在本教程中对此进行了描述 https://engineering.riotgames.com/news/building-jenkins-inside-ephemeral-docker-container
答案 1 :(得分:0)
人们通常会遇到问题 Couldn't connect to Docker daemon
,因为他们不是 docker
组的成员并且没有读取该文件的权限。
使用 sudo
docker 运行会解决这个问题,但这不是一个合适的解决方案。
Docker 可以作为具有适当组权限的非 root 用户(没有 sudo)运行。 Linux post-install docs 有详细信息。
这是简短的版本:
$ 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
组中的用户在没有 docker
的情况下运行 docker-compose
和 sudo
命令的权限。
授予 jenkins 使用权限:
chown jenkins:docker /var/run/docker.sock
答案 2 :(得分:0)
尝试在主机上运行此命令,但这只是一种解决方法:
chmod 777 /var/run/docker.sock
这将允许任何人连接到 docker 守护进程,包括 jenkins 进程