docker - 在 Docker 内部运行的 docker-swarm slave 中使用 docker agent
问题描述
我们有一个 Jenkins 文件,如下所示
pipeline {
agent {
node {
label 'slave-test'
}
}
stages {
stage ('test docker run') {
agent {
docker {
image 'node:14.4.0-slim'
args '-u root -v /var/run/docker.sock:/var/run/docker.sock'
reuseNode true
}
}
steps {
sh 'PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true npm ci'
sh 'npm run test:ci'
sh 'npm run patternlab:build'
}
}
}
标记为slave-test的节点是一个 docker-swarm 客户端,作为基于 debian-buster 的 docker 镜像运行。在这个 slave 中,我们要启动镜像 node:14.4.0-slim 来运行一些测试并打包一些前端的东西。
我们使用reuseNode = true 在管道开始时使用与代理相同的工作区。但詹金斯告诉我们:
[Pipeline] {
[Pipeline] stage
[Pipeline] { (test docker run)
[Pipeline] getContext
[Pipeline] isUnix
[Pipeline] sh
13:24:07 + docker inspect -f . node:14.4.0-slim
13:24:07 .
[Pipeline] withDockerContainer
13:24:07 hofladen-slave01-20d7912d seems to be running inside container 23d34522985b2e7ec99327337cd2b20bee22018562886c9930a4ba777cda11ca
13:24:07 but /home/****/workspace/ttern-library_feature_BWEBHM-262@2 could not be found among [/var/run/docker.sock]
13:24:07 but /home/****/workspace/ttern-library_feature_BWEBHM-262@2@tmp could not be found among [/var/run/docker.sock]
13:24:07 $ docker run -t -d -u 10000:10000 -u root -v /var/run/docker.sock:/var/run/docker.sock -w /home/****/workspace/ttern-library_feature_BWEBHM-262@2 -v /home/****/workspace/ttern-library_feature_BWEBHM-262@2:/home/****/workspace/ttern-library_feature_BWEBHM-262@2:rw,z -v /home/****/workspace/ttern-library_feature_BWEBHM-262@2@tmp:/home/****/workspace/ttern-library_feature_BWEBHM-262@2@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** node:14.4.0-slim cat
13:24:08 $ docker top 0759f74d1c2676d68a32edab9775b2ca3c518fa2e4e673af856a87e9da514683 -eo pid,comm
[Pipeline] {
[Pipeline] sh
13:29:15 process apparently never started in /home/****/workspace/ttern-library_feature_BWEBHM-262@2@tmp/durable-504ce105
13:29:15 (running Jenkins temporarily with -Dorg.****ci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true might make the problem clearer)
[Pipeline] }
13:29:15 $ docker stop --time=1 0759f74d1c2676d68a32edab9775b2ca3c518fa2e4e673af856a87e9da514683
13:29:17 $ docker rm -f 0759f74d1c2676d68a32edab9775b2ca3c518fa2e4e673af856a87e9da514683
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Cancel running builds if exist)
Stage "Cancel running builds if exist" skipped due to earlier failure(s)
为了执行后面的步骤,我们需要在同一个 Jenkins 工作区中运行这些命令。
有没有人知道如何实现这一目标。我们知道,如果管道未在独立机器上的代理上运行,则管道运行良好。
解决方案
通过将 jenkins slave 启动为具有共享数据并允许访问 /var/run/docker.sock 的卷的容器来修复
#!/bin/bash
volume_name=myfinevolume-slave01-workspace
docker volume create ${volume_name}
docker run -d --name jenkins-agent-for-myfineproject \
-v /var/run/docker.sock:/var/run/docker.sock:rw \
--mount source=${volume_name},target=/home/jenkins/workspace \
--memory=8G \
--memory-swap=16G \
--restart unless-stopped \
myfineregsitry.domain.lala/acme/jenkins-swarm-client:3.17.0_buster
推荐阅读
- jquery - Jquery如何在两个多选而不是单选之间找到所有常见选项
- javascript - 如何为角度课程设置播放器?
- arrays - 如何将输入标准输入转换为python中的列表数据结构
- javascript - alpine table 处理请求参数
- python - 如何将必须关闭/删除的内存管理项公开为 python3 中的可导入资源?
- javascript - 需要找到所有回调何时解决
- node.js - 嵌套急切加载仅返回 1 条记录
- ios - Why do App store connect operation errors ITMS-90685 and ITMS-90680 happen?
- sql-server - 如何使用托管标识(连接字符串中没有凭据)从 Azure 函数连接到 Azure SQL?
- html - 配置 prettier 以在 html 中保留空白喜欢