无法连接到詹金斯码头集装箱MacOS内的码头

时间:2020-04-28 22:18:26

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

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

我使用的是macOS 10.13.6(High Sierra)

为Mac 2.2.0.5运行Docker桌面(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 Cloud详细信息...”

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

我尝试了互联网上的所有建议,从创建jenkins用户,docker用户,将jenkins用户放入docker组以及其他东西,但它们在Mac上均不起作用。

问的绝大部分是针对Linux的,所有这些似乎都解决了问题,但是当我尝试在macOS上进行复制时,只是行不通了。

也许我缺少一些步骤,或者人们已经知道他们必须在某些步骤中做,但是我失败了。

我尝试过的一些步骤:

创建使用用户和组詹金斯:

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

2 个答案:

答案 0 :(得分:1)

对于詹金斯来说,最好的办法是让代理负责所有工作,而主代理仅负责编排工作。

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

关于您的问题,您需要知道Docker for Mac在一个小的VM内运行容器,因此在MacOS上添加用户时,该VM没有该用户。 Docker for Mac在将Mac中的uid与容器中的某些uid映射方面发挥了很大的魔力。

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

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

答案 1 :(得分:1)

您需要通过将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容器查看主机网络。问题是MacOS的Docker桌面不支持通过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之后,将您的Host URI设置为tcp://0.0.0.0:2376。当然,您将需要创建一个新的Dockerfile,以FROM jenkins/jenkins:lts扩展jenkins / jenkins:lts,然后按照另一个答案中的建议将Docker添加到容器中