Pon*_*rai 111 jenkins docker jenkins-pipeline
我是码头工人的新手.我只是尝试在我的本地机器(Ubuntu 16.04)中使用docker和Jenkins.
我使用下面的管道脚本配置了一个新作业.
node {
stage('Build') {
docker.image('maven:3.3.3').inside {
sh 'mvn --version'
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它失败并出现以下错误.
小智 182
用户jenkins
需要添加到组中docker
:
sudo usermod -a -G docker jenkins
Run Code Online (Sandbox Code Playgroud)
然后重新启动Jenkins.
小智 41
我的第一个解决方案是
usermod -aG docker jenkins
usermod -aG root jenkins
chmod 664 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
但他们都没有为我工作,我试过:
chmod 777 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
这有效,但我不知道这是不是正确的电话.
Sha*_*mad 31
这在Ubuntu 20.04中对我有用
sudo chmod 666 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
虽然不知道具体是做什么的,但是可以解决问题。
she*_*hub 27
我的成功
sudo usermod -a -G docker $USER
reboot
Run Code Online (Sandbox Code Playgroud)
USM*_*ZIL 24
更改docker.sock文件的访问权限
chmod 777 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
或者你可以sudo
在命令的开头使用。
chmod 777
将允许所有用户的所有操作,同时chmod 666
将允许所有用户读取和写入但不能执行文件。
Dee*_*hta 16
这是一个非常常见的权限问题,这是简单的解决方案:
检查docker有哪些读写权限:
ls -l /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
如果上面的命令说:srw-rw---- 1 root docker 0 Feb 17 12:48 /var/run/docker.sock
然后我们需要更改权限:
sudo chmod 666 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
现在,如果您检查权限,它会显示:
srw-rw-rw- 1 root docker 0 Feb 17 12:48 /var/run/docker.sock
如果您好奇 666 是什么?
读取、写入和执行的权限 [第一个数字表示所有者,第二个数字表示组,第三个数字表示用户],666 比 777 更安全。
Uro*_* T. 14
2018-08-19
我已经在这个问题上待了好几天,因为我还没有找到关于原因和方式的完整答案,因此我将为其他偶然发现相同问题并且上面的答案不起作用的人发布一个答案。
这些是在docker中运行Jenkins的3个关键步骤:
/var/run/docker.sock
到jenkins容器,以便能够从主机使用docker。sudo usermod -a -G docker jenkins
为了添加詹金斯到码头工人小组。但是,如果主机泊坞窗和容器泊坞窗不具有相同的组ID,那么在这里您可能会遇到权限问题,因此将容器泊坞窗的GID调整为与主机泊坞窗GID相同是非常重要的您可以将其作为启动脚本的一部分,也可以直接使用exec
并手动完成:groupmod -g <YOUR_HOST_DOCKER_GID> docker
。
另外,请勿/var/run/docker.sock
将777或类似内容的权限更改为安全隐患,因为这实际上是在向所有人授予在计算机上使用docker的权限
希望这可以帮助
Pra*_*hoo 14
我使用了下面的命令,它对我有用。
sudo chmod 777 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
Pon*_*rai 13
我将jenkins用户添加到root组并重新启动jenkins并开始工作.
sudo usermod -a -G root jenkins
sudo service jenkins restart
Run Code Online (Sandbox Code Playgroud)
Ami*_*aei 12
第 1 步:将您的用户名添加到docker
组中:
sudo usermod -a -G docker $USER
Run Code Online (Sandbox Code Playgroud)
然后注销并再次登录。
步骤2:然后更改docker组ID:
newgrp docker
Run Code Online (Sandbox Code Playgroud)
奖励:检查您的新组:
id -g
Run Code Online (Sandbox Code Playgroud)
PS如果你有兴趣,参考这里。
ahm*_*ira 12
我使用以下命令修复了此问题:
sudo chmod 777 /var/run/docker.sock
sudo chown ${USER}:docker /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
Pro*_*ton 11
我遇到了一个类似的问题,这是一个权限问题,这个问题的原因是因为 Docker 守护进程/服务器总是以root
用户身份运行,并且希望你总是在 docker 命令前加上sudo
.
Docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。默认情况下,Unix 套接字归用户所有root
,其他用户只能使用sudo
.
为了解决这个问题,这对我有用:
首先,检查您是否已经创建了一个 docker 组:
cat /etc/group
Run Code Online (Sandbox Code Playgroud)
如果docker
在显示的列表中没有找到,则需要创建一个:
sudo groupadd docker
Run Code Online (Sandbox Code Playgroud)
接下来,使用以下命令确认您user
和您group
:
cat /etc/group
Run Code Online (Sandbox Code Playgroud)
滚动查看 docker 组。应该是这种格式
docker:x:140:promisepreston
Run Code Online (Sandbox Code Playgroud)
哪里docker
是我的group
,promisepreston
是我的user
现在我们可以将您的用户添加到 docker 组
还将您的用户添加到“docker”组,如果您想以非 root 用户身份使用 Docker:
复制并在您的终端中准确地运行下面的命令,而无需以任何方式对其进行修改,无论您要运行或正在尝试运行的 docker 映像/容器/命令是什么,还是导致权限问题:
sudo usermod -aG docker $USER
Run Code Online (Sandbox Code Playgroud)
运行上述命令后,您需要注销并重新登录,以便重新评估您的组成员身份。但是,在 Linux 上,您还可以运行以下命令来激活对组的更改(在终端中复制并运行以下命令,无需以任何方式对其进行修改,无论 docker image/container/command您想要运行或正在尝试运行或导致权限问题):
newgrp docker
Run Code Online (Sandbox Code Playgroud)
或者
sudo systemctl restart docker
Run Code Online (Sandbox Code Playgroud)
您现在可以通过再次运行导致权限问题的命令来验证您是否可以在没有 sudo 权限的情况下运行 docker 命令,例如(替换my-command
为您的图像/容器/命令的名称):
docker run my-command
Run Code Online (Sandbox Code Playgroud)
对于 Docker 和本地文件系统文件:
如果您在本地文件系统上有这些文件的副本,那么您可以使用以下格式更改存储应用程序文件的应用程序目录的所有权:
sudo?? ? chown?? ? your_user:your_group?? ? -R?? my-app-directory/
Run Code Online (Sandbox Code Playgroud)
所以就我而言,它将是:
sudo chown promisepreston:docker -R my-app-directory/
Run Code Online (Sandbox Code Playgroud)
注意:请在包含应用程序目录的父目录中运行此命令。
就这样。
我希望这有帮助
Cha*_*nka 10
方法 01 :- 更安全的方法
sudo usermod -aG docker ${USER}
Run Code Online (Sandbox Code Playgroud)
要应用新的组成员身份,请退出服务器并重新登录,或键入以下内容:
su - ${USER}
Run Code Online (Sandbox Code Playgroud)
系统将提示您输入用户密码以继续。通过键入以下内容确认您的用户现在已添加到 docker 组:
id -nG
Run Code Online (Sandbox Code Playgroud)
方法 02 :- 不推荐用于公共部署(不安全)
chmod 777 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
我有詹金斯在多克尔运行并连接詹金斯经由体积使用泊坞插座从主机Ubuntu的16.04到/var/run/docker.sock.
对我来说解决方案是:
1)Jenkins的Docker容器内部(docker exec -it jenkins bash
在主机上)
usermod -a -G docker jenkins
chmod 664 /var/run/docker.sock
service jenkins restart (or systemctl restart jenkins.service)
su jenkins
Run Code Online (Sandbox Code Playgroud)
2)在主机上:
sudo service docker restart
Run Code Online (Sandbox Code Playgroud)
664
表示 - 为组中的所有者和用户读取和写入(但不执行).
sudo usermod -a -G docker jenkins
Run Code Online (Sandbox Code Playgroud)
当使用Docker映像作为Jenkins Agent时,并不总是足够的。也就是说,如果您Jenkinsfile
以pipeline{agent{dockerfile
或开头pipeline{agent{image
:
pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
}
}
stages {
Run Code Online (Sandbox Code Playgroud)
这是因为詹金斯执行了一条docker run
命令,这导致了三个问题。
docker run
它不会登录到容器(更像是sudo
)。要使Docker程序在Docker映像中可用,仅需要在Dockerfile中运行Docker安装步骤:
# Dockerfile.jenkinsAgent
FROM debian:stretch-backports
# Install Docker in the image, which adds a docker group
RUN apt-get -y update && \
apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
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-get -y update && \
apt-get -y install \
docker-ce \
docker-ce-cli \
containerd.io
...
Run Code Online (Sandbox Code Playgroud)
正如以前所说,定影所以这股与泊坞守护进程是多克尔守护插座运行詹金斯多克尔容器的第二个问题的装置外的容器。因此,您需要告诉Jenkins使用该共享来运行Docker容器,因此:
pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
args '-v /var/run/docker.sock:/var/run/docker.sock'
}
}
Run Code Online (Sandbox Code Playgroud)
解决第三个问题的理想方法是为代理设置补充小组。这似乎不可能。我知道的唯一解决方法是使用Jenkins UID和Docker GID运行代理(套接字具有组写许可权,并由拥有root.docker
)。但是总的来说,您不知道这些ID是什么(当在主机上安装Jenkins和Docker 时,它们是在useradd ... jenkins
和groupadd ... docker
时分配的)。而且您不能简单地将詹金斯告诉用户user jenkins
和groupdocker
args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
Run Code Online (Sandbox Code Playgroud)
因为这告诉泊坞窗使用的是被命名为用户和组jenkins
,并docker
在图像中,和你的多克尔图像可能不具备jenkins
用户和组,即使它确实就没有保证,将有相同的UID和GID为主机,并且同样无法保证docker
GID相同
幸运的是,Jenkins docker build
在脚本中运行Dockerfile 的命令,因此您可以做一些shell脚本魔术来作为Docker构建参数传递这些信息:
pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
additionalBuildArgs '--build-arg JENKINSUID=`id -u jenkins` --build-arg JENKINSGID=`id -g jenkins` --build-arg DOCKERGID=`stat -c %g /var/run/docker.sock`'
args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
}
}
Run Code Online (Sandbox Code Playgroud)
该id
命令使用命令获取用户的UID和GID,jenkins
并使用stat
命令获取有关Docker套接字的信息。
您Dockerfile可以使用这些信息来建立一个jenkins
用户和docker
组的代理,使用groupadd
,groupmod
以及useradd
:
# Dockerfile.jenkinsAgent
FROM debian:stretch-backports
ARG JENKINSUID
ARG JENKINSGID
ARG DOCKERGID
...
# Install Docker in the image, which adds a docker group
RUN apt-get -y update && \
apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
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-get -y update && \
apt-get -y install \
docker-ce \
docker-ce-cli \
containerd.io
...
# Setup users and groups
RUN groupadd -g ${JENKINSGID} jenkins
RUN groupmod -g ${DOCKERGID} docker
RUN useradd -c "Jenkins user" -g ${JENKINSGID} -G ${DOCKERGID} -M -N -u ${JENKINSUID} jenkins
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
96558 次 |
最近记录: |