我是码头工人的新手。我只是试着在我的本地机器(Ubuntu 16.04)上使用docker和Jenkins。

我用下面的管道脚本配置了一个新作业。

node {
    stage('Build') {
      docker.image('maven:3.3.3').inside {
        sh 'mvn --version'
      }
    }
}

但是它失败了,错误如下:

在unix:///var/run/ Docker .sock试图连接到Docker守护进程套接字时被拒绝


当前回答

我遇到过类似的问题,这是一个权限问题,这个问题的原因是Docker守护进程/服务器总是作为根用户运行,并希望您总是使用sudo来为Docker命令作序。

Docker守护进程绑定到Unix套接字而不是TCP端口。默认情况下,Unix套接字由root用户拥有,其他用户只能使用sudo访问它。

为了解决这个问题,以下是对我有效的方法:

首先,检查是否已经创建了docker组:

cat /etc/group

如果你在显示的列表中没有找到docker,那么你需要创建一个:

sudo groupadd docker

接下来,使用下面的命令确认您的用户和组:

cat /etc/group

滚动查看docker的组。应该是这样的格式

docker:x:140:promisepreston

docker是我的组,promisepreston是我的用户

现在我们可以将您的用户添加到docker组

将你的用户加入docker组,如果你想以非root用户的身份使用docker:

在你的终端上复制并运行下面的命令,而不需要以任何方式修改它,不管你想要运行或试图运行的docker image/container/命令是什么,或者是导致权限问题的:

sudo usermod -aG docker $USER

运行上面的命令后,您将需要注销并重新登录,以便重新评估您的组成员资格。然而,在Linux上,你也可以运行下面的命令来激活对组的更改(在你的终端上复制并运行下面的命令,而不以任何方式修改它,不管你想要运行或试图运行或导致权限问题的docker image/container/命令):

newgrp docker

OR

sudo systemctl restart docker

您现在可以验证您可以在没有sudo权限的情况下运行docker命令,通过再次运行导致权限问题的命令,例如(将my-command替换为您的image/container/命令的名称):

docker run my-command

对于Docker和Local文件系统文件:

如果你在本地文件系统上有一份文件的副本,那么你可以使用以下格式更改应用程序文件存储的应用程序目录的所有权:

sudo​​ ​ chown​​ ​ your_user:your_group​​ ​ -R​​ my-app-directory/

所以在我的例子中,它将是:

sudo chown promisepreston:docker -R my-app-directory/

注意:请在应用程序目录所在的父目录中运行此命令。

这是所有。

我希望这对你们有帮助

其他回答

在我的例子中,不仅需要将jenkins用户添加到docker组,而且需要将该组作为jenkins用户的主组。

# usermod -g docker jenkins
# usermod -a -G jenkins jenkins

不要忘记重新连接jenkins从节点或重新启动jenkins服务器,这取决于您的情况。

也许你应该从一开始就使用“-u root”选项运行docker

至少这解决了我的问题

除了将用户添加到docker组并尝试本线程中提到的所有方法之外,我花了一段时间才意识到我必须重新启动我的终端,然后重新登录到ec2实例。从那以后,它起作用了。

第一步:将用户名加入docker组:

sudo usermod -a -G docker $USER

然后注销并重新登录。

第二步:修改docker组ID:

newgrp docker

奖励:检查你的新组:

id -g

附:如果你感兴趣,参考资料在这里。

我使用的是官方的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