jenkins 我可以在Ubuntu中访问docker.sock,但不能在Docker Desktop Windows中访问,

iyr7buue  于 12个月前  发布在  Jenkins
关注(0)|答案(1)|浏览(166)

此问题在此处已有答案

Docker not found when building docker image using Docker Jenkins container pipeline(8个答案)
上个月关门了。
我想在Windows上使用Docker Desktop和Jenkins设置CICD,并从Jenkins容器运行docker命令。据我所知,一种方法是通过套接字docker.sock将主机docker守护程序暴露给Jenkins容器。当我运行下面的compose.yaml时,

version: '3.8'
services:
    jenkins:
      image: jenkins/jenkins:lts
      privileged: true
      user: root
      ports:
        - 8080:8080
        - 50000:50000
      volumes:
        - jenkins-data:/var/jenkins_home
        - /var/run/docker.sock:/var/run/docker.sock
        - /usr/bin/docker:/usr/bin/docker

volumes:
  jenkins-data:

字符串
在安装了docker的Ubuntu虚拟机中使用docker compose up -d --build命令,Jenkins容器可以运行docker命令,一切似乎都按预期工作。例如,我可以在docker容器中运行docker -v(不需要sudo)。
但是当我在我的Windows(Windows 10 Pro,19045.3693)笔记本电脑上运行相同的compose.yaml与Docker Desktop(4.25.2)时,Jenkins容器无法运行docker命令。当我在Jenkins容器内运行docker -v时,我得到错误:
/bin/sh: 1: docker: not found
我还在Jenkins VM中安装了sudo,并运行sudo docker -v,得到错误:
sudo: docker: command not found
我尝试过的更多的事情是使用一个额外的斜杠- //var/run/docker.sock:/var/run/docker.sock。我尝试过使用命名管道,但我认为只有当你想运行一个Windows容器时才有意义。我还尝试过绑定挂载/usr/bin/docker:/usr/bin/docker//usr/bin/docker:/usr/bin/docker/usr/local/bin/docker:/usr/bin/docker
有什么想法吗?
编辑:我忘记了卷下的- /usr/bin/docker:/usr/bin/docker。这是在Ubuntu中工作所需要的。
编辑:这篇文章是关于如何让它在Windows上与Docker Desktop一起工作的。所有其他帖子都没有提到Docker Desktop,并且似乎假设了Linux环境。在第一句话中添加了澄清。我认为这个问题不应该被关闭,因为它可以说明Ubuntu VM和Docker Desktop之间的差异。

m3eecexj

m3eecexj1#

当前的jenkins/jenkins:lts镜像没有安装docker客户端,你需要将其添加到镜像中并使用它。
有趣的是,即使在jenkins/jenkins:lts运行的容器中没有安装docker插件,你的compose文件也能在ubuntu虚拟机上工作。也许以前的jenkins/jenkins:lts镜像有它,而ubuntu虚拟机上的docker引擎仍然有它,这就是为什么你不应该使用latest,lts等运行标签/版本,因为底层软件可以并且会随着时间的推移而改变,你应该像jenkins/jenkis:1.2.3-debian这样固定你的版本。
无论如何,这适用于我的Windows 10机器与Docker Desktop for Windows:
创建这个Dockerfile:

FROM jenkins/jenkins:2.426.1-lts-jdk17

USER root

# Install Docker client cli
RUN apt-get update && \
    apt-get -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common && \
    curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - && \
    apt-key fingerprint 0EBFCD88 && \
    add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/debian \
    $(lsb_release -cs) \
    stable" && \
    apt-get update && \
    apt-get -y install docker-ce-cli

# create docker group 
RUN groupadd -g 1001 docker

# add jenkins user to docker group
RUN usermod -aG docker jenkins

USER jenkins

字符串

**!!!很重要!!!**你必须在RUN groupadd -g 1001 docker命令中为docker组使用与在wsl发行版上相同的命令,你启用了Docker Desktop WSL 2集成,并从那里发出命令(docker build,docker run等)。你可以用getent group docker检查wsl 2发行版上的命令,对我来说它是1001。

注意事项:Docker引擎,服务器,本身并没有运行在这个wsl 2发行版中,而是有自己独立的wsl 2发行版,名为docker-desktop和docker-desktop-data。你可以用docker客户端连接到这个docker引擎服务器,docker命令。
创建镜像:docker build -f Dockerfile -t myjenkins:1.0.0-docker-cli .
从您启用Docker Desktop集成的wsl 2发行版shell的映像运行容器:docker run -v /var/run/docker.sock:/var/run/docker.sock --rm -it myjenkins:1.0.0.-docker-cli sh
在容器shell中执行docker ps,您将看到您的容器在主机上运行,包括您当前所在的容器。

请注意,授予对容器的这种访问权限将授予jenkins用户对主机的根级别访问权限:https://docs.docker.com/engine/security/#docker-daemon-attack-surface

相关问题