首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与詹金斯代理一起运行码头集装箱

与詹金斯代理一起运行码头集装箱
EN

DevOps用户
提问于 2022-08-30 09:04:46
回答 1查看 591关注 0票数 1

我正在寻找一种方法来运行Docker (dind)容器,在我的Jenkins代理节点旁边使用Jenkins插件,该插件由Jenkins Configuration-as-Code (JCasC)配置。

我目前正在运行一个普通代理节点,该节点安装了我的所有工具。包括码头客户。但是没有运行服务器/守护进程。我现在的想法是添加另一个容器,即运行Docker守护进程。两个容器共享相同的工作目录,因此它们对相同的数据进行操作。

为什么要把它作为两个容器运行?Docker守护进程需要特权访问。我想尽可能的限制它。

我遇到的第一个问题是,Jenkins在豆荚建成后并没有杀死它,而只是结束了代理过程。现在,随着另一个容器的运行,吊舱仍能存活。我修正了这个问题,在代理结束符停止时将一个文件写入另一个共享卷,然后由dind读取该文件,并在文件出现时退出。

下面是我当前Pod配置的摘录:

代码语言:javascript
复制
apiVersion: "v1"
kind: "Pod"
spec:
  serviceAccountName: jenkins-agent
  containers:
  - image: "jenkins-jnlp-image"
    command: [ "/bin/sh", "-c" ]
    args:
    - |
      trap 'touch /usr/share/pod/done' EXIT
      /entrypoint.sh
    name: "jnlp"
    env:
    - name: DOCKER_HOST
      value: tcp://localhost:2375
    securityContext:
      privileged: false
    tty: true
    volumeMounts:
    - mountPath: "/home/jenkins/agent"
      name: "workspace-volume"
      readOnly: false
    - mountPath: /usr/share/pod
      name: tmp-pod
    workingDir: "/home/jenkins/agent"
  - image: "dind-image"
    name: "dind"
    command: [ "/bin/sh", "-c" ]
    args:
      - |
        dockerd-entrypoint.sh &
        while ! test -f /usr/share/pod/done; do
        echo 'Waiting for the jnlp to finish...'
        sleep 5
        done
        echo "Agent pod finished, exiting"
        exit 0
    securityContext:
      privileged: true
    tty: false
    volumeMounts:
    - mountPath: "/home/jenkins/agent"
      name: "workspace-volume"
      readOnly: false
    - mountPath: /usr/share/pod
      name: tmp-pod
    workingDir: "/home/jenkins/agent"
  volumes:
    - emptyDir:
        medium: ""
      name: "workspace-volume"
    - emptyDir: {}
      name: tmp-pod

这是一种卑劣的做法吗?还有更好的吗?

附加问题:我是从官方赫尔姆图安装的。我还没有找到一个很好的方法在那里添加另一个容器,而不覆盖整个pod模板。有人知道办法吗?如果不是,我可能会创建一个公关添加作为一个功能。

提前感谢!

EN

回答 1

DevOps用户

发布于 2022-11-14 20:04:29

我写了关于码头代理中的詹金斯码头工人的文章,您可能会发现它很有用。

这篇文章详细回答了你的问题。

我很快也会在这里回答他们:

为什么要把它作为两个容器运行?

第一个是带有Docker客户端的容器。它基本上是Jenkins代理,因为它扩展了jenkins/jnlp- agent -docker的基本图像。第二个是带有Docker守护进程的容器。

我是从官方的Helm图表安装的。我还没有找到一个很好的方法在那里添加另一个容器,而不覆盖整个pod模板。

您需要在舵机图表additionalAgents中的values.yaml中添加一个对码头代理的引用。请参阅码头代理中的码头工人配置示例。

票数 1
EN
页面原文内容由DevOps提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://devops.stackexchange.com/questions/16519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档