首页 > 解决方案 > 如何使用 Docker Desktop for Windows 在 Jenkins 的 Docker 设置之外实现 Docker?

问题描述

我正在尝试使用 Jenkins 创建一个 CI/CD 基础架构。考虑到可恢复性、性能和可维护性主题,我决定将 Jenkins 和代理都作为 Docker 容器来处理。

有一些我无法解决的限制:

据我所知,Docker 设置之外的 Docker 是正确的实现方式。如果我使用以下命令以 root 身份运行容器,我可以绑定 docker.sock 文件,Jenkins 作业可以从 Dockerfiles 创建容器作为代理:

docker run --name dood `
-d -u root --restart on-failure `
-p "8080:8080" -p "50000:50000" `
-v //var/run/docker.sock:/var/run/docker.sock `
-v /usr/local/bin/docker:/usr/bin/docker `
jenkins/jenkins:lts

但是,如果 Jenkins 容器以非 root 用户运行,则它不起作用。这是不可接受的,因为它会造成漏洞。建议的方法是在没有 root 用户的情况下运行容器并将“jenkins”用户分配给“docker”组:

groupadd docker
usermod -a -G docker jenkins
newgrp docker

不幸的是,它不起作用。当 Jenkins 作业尝试创建代理容器时,会出现“获得权限被拒绝...”错误。我重新启动了 Docker Desktop 和容器,但结果是一样的。我不确定,但可能的原因可能是 Windows 环境。这可能适用于 Linux 环境。

作为最后的努力,我尝试了stackoverflow 主题中描述的解决方案。我注意到当 Docker 使用 Hyper-V 运行时,“setfacl”命令不起作用。如果我在演示 PC 上切换到 WSL2,则以下命令可以解决问题:

gpasswd -a jenkins docker
apt-get install acl
setfacl -m user:jenkins:rw /var/run/docker.sock

不幸的是,目标 Windows 环境不支持 WSL2,所以我不能使用这个解决方案。此外,setfacl 命令不是持久的,但这是另一回事。

另一种解决方案可能是激活“在没有 TLS 的情况下在 tcp://localhost:2375 上公开守护程序”选项。但是,从安全角度来看,这是不可接受的,因此我将其划掉。

我很好奇是否有可能在 Docker Desktop for Windows 上为 Jenkins 的 Docker 设置之外实现 Docker。考虑到命名的限制,我也对替代设置/解决方案持开放态度。

我对 Docker 很陌生,对 Jenkins 也不是很熟悉。如果我使用了错误的术语或方法,请告诉我。

标签: dockerjenkinsdevopsdocker-desktop

解决方案


推荐阅读