【问题标题】:Can't connect to docker inside jenkins docker container MacOS无法连接到詹金斯码头集装箱MacOS内的码头工人
【发布时间】:2020-04-28 22:18:26
【问题描述】:

经过整整两天的阅读和尝试,我谦卑地来到这里询问如何使这项工作发挥作用,因为其他答案中没有任何东西可以帮助我完成这项工作。

我使用的是 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 组 e 其他东西,但它们都不能在 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

【问题讨论】:

  • 对于您的第一个问题,只需在您的 Dockerfile 中下载 docker 客户端 RUN curl https://download.docker.com/linux/static/stable/x86_64/docker-19.03.8.tgz | tar xvz --directory /tmp && mv -v /tmp/docker/docker /usr/local/bin/docker && chmod +x /usr/local/bin/docker && rm -rf /tmp/docker 是否还有其他问题,这不起作用?请务必了解:在 Mac 上编辑任何用户或组均无济于事。 Docker for Mac 正在运行一个虚拟机,Docker 守护进程(= 服务器)位于其中。例如“unix:///var/run/docker.sock”在该虚拟机以及所有必要的用户/组内
  • 如果你想使用安装在host中的docker,你可以挂载docker bin文件和docker socket。我在 docker 容器中使用 jenkins,docker 安装在安装的主机中以构建和运行图像,它对我来说效果很好。我也在使用mac osx。 - /var/run/docker.sock:/var/run/docker.sock - /usr/local/bin/docker:/usr/bin/docker
  • 如果你可以在 mac 上运行 kubernetes(docker for mac 自带 kubernates)。你可以按照这个。 medium.com/faun/…

标签: macos docker jenkins docker-compose jenkins-pipeline


【解决方案1】:

对于詹金斯来说,最好的办法是让代理运行所有作业,而主服务器只执行编排作业。

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

关于您的问题,您需要知道 Docker for Mac 在一个小 VM 内运行容器,因此当您在 MacOS 上添加用户时,VM 没有它。 Docker for Mac 做了很多神奇的事情,可以将你的 mac 中的 uid 映射到容器中的一些 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

【讨论】:

    【解决方案2】:

    您需要通过将network: host 添加到您的撰写文件来启用主机模式网络:

    
    services:
      jenkins:
    
        build: 
          dockerfile: dockerfile
          context: ./build
          network: host
    
        ports:
          - "8080:8080"
          - "50000:50000"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - ./data:/var/jenkins_home
    

    这将允许您的访客 docker 容器查看主机网络。问题是 Docker Desktop for MacOS 不支持侦听 TCP 端口。使用 socat 有一个已知的解决方法。 https://www.ivankrizsan.se/2016/05/21/docker-api-over-http-on-mac-os-x-with-docker-for-mac-beta/。将 socat 设置为从 docker.socker 路由到 TCP 2376 后,将主机 URI 设置为 tcp://0.0.0.0:2376。当然,您需要创建一个新的 Dockerfile 以使用 FROM jenkins/jenkins:lts 扩展 jenkins/jenkins:lts 并按照另一个答案中的建议将 Docker 添加到容器中

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。 jenkins 用户即使在将用户添加到 docker 组后也无法运行 docker 命令。

      当我检查主机 (MacOS) 上的权限时,docker.sock 文件归 root:daemon 所有。

      ls -lart /var/run/docker.sock
      lrwxr-x--x  1 root  daemon  37 Feb  1 14:56 /var/run/docker.sock -> /Users/....
      

      我将权限更新为755,它开始工作了。我能够以jenkins 用户身份在容器上运行 docker 命令。

      请仅更改开发环境的主机文件权限。

      【讨论】:

        猜你喜欢
        • 2018-07-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-29
        • 2019-07-19
        • 1970-01-01
        • 2019-03-17
        • 2023-04-01
        • 1970-01-01
        相关资源
        最近更新 更多