我正在寻找一种方法来运行Docker (dind)容器,在我的Jenkins代理节点旁边使用Jenkins插件,该插件由Jenkins Configuration-as-Code (JCasC)配置。
我目前正在运行一个普通代理节点,该节点安装了我的所有工具。包括码头客户。但是没有运行服务器/守护进程。我现在的想法是添加另一个容器,即运行Docker守护进程。两个容器共享相同的工作目录,因此它们对相同的数据进行操作。
为什么要把它作为两个容器运行?Docker守护进程需要特权访问。我想尽可能的限制它。
我遇到的第一个问题是,Jenkins在豆荚建成后并没有杀死它,而只是结束了代理过程。现在,随着另一个容器的运行,吊舱仍能存活。我修正了这个问题,在代理结束符停止时将一个文件写入另一个共享卷,然后由dind读取该文件,并在文件出现时退出。
下面是我当前Pod配置的摘录:
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模板。有人知道办法吗?如果不是,我可能会创建一个公关添加作为一个功能。
提前感谢!
发布于 2022-11-14 20:04:29
我写了关于码头代理中的詹金斯码头工人的文章,您可能会发现它很有用。
这篇文章详细回答了你的问题。
我很快也会在这里回答他们:
为什么要把它作为两个容器运行?
第一个是带有Docker客户端的容器。它基本上是Jenkins代理,因为它扩展了jenkins/jnlp- agent -docker的基本图像。第二个是带有Docker守护进程的容器。
我是从官方的Helm图表安装的。我还没有找到一个很好的方法在那里添加另一个容器,而不覆盖整个pod模板。
您需要在舵机图表additionalAgents中的values.yaml中添加一个对码头代理的引用。请参阅码头代理中的码头工人配置示例。
https://devops.stackexchange.com/questions/16519
复制相似问题