我是码头工人的新手。我只是试着在我的本地机器(Ubuntu 16.04)上使用docker和Jenkins。
我用下面的管道脚本配置了一个新作业。
node {
stage('Build') {
docker.image('maven:3.3.3').inside {
sh 'mvn --version'
}
}
}
但是它失败了,错误如下:
在unix:///var/run/ Docker .sock试图连接到Docker守护进程套接字时被拒绝
我可以在不更改本地unix套接字/var/run/docker.sock上的权限的情况下使其工作。我需要做的是在构建代理节点上启用tcp连接,然后在Jenkins云配置中指定docker主机。
假设您正在使用aws映像,ssh到构建代理节点,并使用/etc/sysconfig/docker文件启用tcp端口
增加-H tcp://0.0.0.0:2376选项。
# Additional startup options for the Docker daemon, for example:
# OPTIONS="--ip-forward=true --iptables=true"
# By default we limit the number of open files per container
OPTIONS="-H tcp://0.0.0.0:2376 --default-ulimit nofile=1024:4096"
确保使用sudo service docker restart重新启动守护进程
最后,您需要告诉Jenkins使用云节点配置中配置的DOCKER_HOST环境变量默认使用tcp。注意,这不是Jenkins管道环境中的配置。
导航到Jenkins ->管理Jenkins ->管理云和节点->部分配置-> .
节点属性->环境变量
然后添加DOCKER_HOST环境变量。
注意:我通过ssh使用启动代理来实现这一工作。
我使用的是官方的jenkins docker映像(https://hub.docker.com/r/jenkins/jenkins),但我认为这个解决方案适用于我们想要在docker容器中运行docker的大多数用例。
在Docker容器中使用Docker的推荐方法是使用主机系统的Docker守护进程。这方面的好文章:https://itnext.io/docker-in-docker-521958d34efd。
处理权限问题的秘诀是在容器内为容器的用户添加权限,而不是为主机系统添加权限。默认情况下只有root用户有权限这样做,所以
docker exec -it -u root <container-name> bash
usermod -a -G docker <username>
我会做的。记得重新启动容器。
我想最简单的方法是创建一个定制的Dockerfile:
# Official jenkins image
FROM jenkins/jenkins:lts
# Swith to root to be able to install Docker and modify permissions
USER root
RUN apt-get update
# Install docker
RUN curl -sSL https://get.docker.com/ | sh
# Add jenkins user to docker group
RUN usermod -a -G docker jenkins
# Switch back to default user
USER jenkins
# Bild the image:
# sudo docker build -t yourusername/imagename .
# Run the image and mount with the followin bind mount option:
# sudo docker run --name imagename -d -p8080:8080 -v /var/run/docker.sock:/var/run/docker.sock yourusername/imagename