首页 > 解决方案 > 在 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 工作区中运行这些命令。

有没有人知道如何实现这一目标。我们知道,如果管道未在独立机器上的代理上运行,则管道运行良好。

标签: dockerjenkinsjenkins-pipeline

解决方案


通过将 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

推荐阅读