macos - 无法连接到 jenkins docker 容器 MacOS 内的 docker

标签 macos docker jenkins docker-compose jenkins-pipeline

经过整整两天的阅读和尝试,我谦虚地来到这里询问如何进行这项工作,因为其他答案中的任何内容都没有帮助我完成这项工作。

我在 macos 10.13.6 (High Sierra)

运行 Docker Desktop for mac 2.2.0.5 (43884)

Engine: 19.03.8
Compose 1.25.4

我想运行 jenkins 来研究一些管道的东西,所以这是我的“docker-compose.yml”
version: "3.2"

services:
  jenkins:

    build: 
      dockerfile: dockerfile
      context: ./build

    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/var/jenkins_home

第一个问题是我使用的图像 jenkins/jenkins:lts没有安装 docker 客户端,所以即使通过卷映射套接字我也不能使用 docker version此命令的输出是 bash: docker: command not found .

这是我仅用于测试的管道(来自 jenkins 文档):
pipeline {
    agent { docker { image 'node:6.3' } }
    stages {
        stage('build') {
            steps {
                sh 'npm --version'
            }
        }
    }
}

所以通过这个插件https://plugins.jenkins.io/docker-plugin/我可以转到“管理 Jenkins > 管理节点和云 > 配置云 > 添加新云”和“Docker 云详细信息...”

我有主机 URI,我可以在其中放置“unix:///var/run/docker.sock”,它将使用我的主机 macos 中的 docker 来执行 jenkins 需要做的事情。

我尝试了互联网上的所有建议,从创建 jenkins 用户,docker 用户,将 jenkins 用户放在 docker 组和其他东西上,但没有一个在 mac 上工作。

大多数被问到的问题都是针对 linux 的,所有这些问题似乎都解决了这个问题,但是当我尝试在 macos 上复制时,它就不起作用了。

也许我遗漏了某些步骤,或者人们已经知道他们必须在某些步骤中执行,但我失败得很惨。

我尝试的一些步骤:

创建使用用户和组 jenkins:
sudo dscl . create /Users/jenkins UniqueID 1000 PrimaryGroupID 1000
sudo dscl . create /Groups/jenkins gid 1000

创建组 docker :
sudo dscl . create /Groups/docker gid 1001

将 jenkins 用户添加到 docker 组
sudo dscl . append /Groups/docker GroupMembership jenkins

检查用户是否真的在组中
$ dsmemberutil checkmembership -u 1000 -g 1001
user is a member of the group

试图从 jenkins 容器内部更改套接字的所有者(这就是我构建图像的原因,但它不起作用)

试图改变主机 macos 上套接字的所有权,但它只是不改变。
套接字始终具有这些权限。

lrwxr-xr-x 1 root daemon 68B Apr 28 10:14 docker.sock -> /Users/metasix/Library/Containers/com.docker.docker/Data/docker.sock

最佳答案

对于 Jenkins 来说,最好的办法是拥有将运行所有作业的代理和仅执行编排作业的主控。

几年前,我构建了一个将自身注册到 jenkins master 的 JNLP 代理,您可以在这里查看我的 repo:https://github.com/jmaitrehenry/docker-jenkins-jnlp
正如我所说,我是 3 年前制作的,可能有点过时了。

关于你的问题,你需要知道Docker for Mac是在一个小VM里面运行容器的,所以当你在MacOS上添加一个用户的时候,这个VM是没有的。 Docker for Mac 做了很多神奇的事情,将 uid 映射到你的 mac 中,并在容器中使用一些 uid。

您可以尝试在 Dockerfile 中添加 docker 客户端,为此,请尝试添加以下步骤:

FROM jenkins/jenkins:lts
[...]

# Switch to root as the base image switch to jenkins user
USER root

# Download docker-cli and install it
RUN curl -o docker-ce-cli.deb https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce-cli_19.03.8~3-0~debian-stretch_amd64.deb && \
    dpkg -i docker-ce-cli.deb && \
    rm docker-ce-cli.deb

# Switch back to jenkins user
USER jenkins

关于macos - 无法连接到 jenkins docker 容器 MacOS 内的 docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61490937/

相关文章:

macos - iterm vim colorscheme无法正常工作

c++ - OpenCL 实现的算法比正常循环慢

Jenkins 文本查找器插件,如何将此插件与 jenkinsfile 一起使用?

testing - 一次集成测试两个 Grails Web 应用程序?

windows - 源代码管理 - XCode - Visual Studio 2005/2008/2010

c++ - 使用 RtMidi 在 OS X 上使用内置的通用 midi?

docker - 私有(private) docker 注册表和 python

python - 使用Docker容器运行django应用失败

amazon-web-services - 如何通过 Elasticbeanstalk 配置文件(使用 Docker)访问环境变量?

jenkins - 无法连接到/var/jenkins_home/.ssh/known_hosts 的 Jenkins Slave No Known Hosts 文件