【问题标题】:How to run Dockerfile agent on a Jenkins Slave Node?如何在 Jenkins 从节点上运行 Dockerfile 代理?
【发布时间】:2021-12-08 06:51:30
【问题描述】:

请在下面帮助我。 我在一台共享服务器上安装了 Jenkins。目前被多个团队使用,因此不允许在那里安装额外的软件包/软件。 每个团队都有自己的专用从节点添加到他们根据需要进行配置的位置。 同样,我们有一个专用节点来运行我们的工作。(这也是我想运行我的工作的地方)

我有 bitbucket 存储库,其中包含“Jenkinsfile”,其中包含部署步骤和“Dockerfile”,我们希望从中创建容器并在其中运行部署步骤.

我想先用一些例子来测试一下。所以我有这样的“Dockerfile”。

#This image is Developed from ubuntu:18.04-Dockerhub
FROM ubuntu:18.04

#Updating System Packages and installing required packages
RUN apt-get update && \
    apt-get install -y openssh-server wget git curl zip unzip && \
    apt-get clean

#Installing rsync
RUN apt-get install -y rsync 

我有“Jenkinsfile”,如下所示。

pipeline {
    agent { node { label 'slave_node' } }
    stages {
        stage('Test') {
            agent {
                dockerfile true
            }
            steps {
                sh 'cat /etc/os-release'
                sh 'curl --version'
                sh 'echo Successfully compiled'
            }
        }
    }
} 

当我执行这个管道作业时,

  • 它获取 Jenkins 文件。
  • 在提到的从节点上正确启动。
  • 签出回购代码。
  • 进入阶段
  • 但是当涉及到阶段('Test')时,Node 变回“Master Jenkins”并再次开始检查 repo 代码。 [这是我有问题的地方。我不知道为什么要切换]
  • 进入阶段
  • 运行“Docker 文件”
  • 尝试从集线器拉取图像。但由于“找不到 Docker 命令”而导致作业失败(由于主节点没有设置,因此预期错误。

问题是:为什么 Job 从 Slave_node 切换到 master_node? 请帮忙。提前致谢。

如果我在我的个人笔记本电脑上运行它,它的工作非常好。

【问题讨论】:

    标签: docker jenkins


    【解决方案1】:

    我会在 Jenkins 中检查您的 Docker 设置。可能您已将主节点定义为默认 Jenkins 代理,因此当您仅使用 'dockerfile: true' 运行时,它会尝试在主节点上运行构建。

    您可以通过在本文档中搜索“指定 Docker 标签”来找到对此特定选项的参考。

    https://www.jenkins.io/doc/book/pipeline/docker/

    【讨论】:

    • 嗨@Ramzi,我之前也是这样。我们有 3 到 4 个从节点,配置为“尽可能多地使用”选项。最初,切换过去常常发生在这 4 个从节点中的任何其他节点上。所以我们将它们全部更新为“仅在指定时使用”选项。之后,它开始切换回主人。这就是我现在卡住的地方,不知道为什么。
    • 我检查了你提到的设置。它没有在任何地方定义。
    • 如果该选项不存在,那么您没有安装 docker 管道。我会检查并确保它是。
    【解决方案2】:

    参考https://www.jenkins.io/doc/book/pipeline/docker/ 我能够使用脚本化管道来满足我的需求。所以在这里发布作为答案。

    但我仍然不知道声明式管道有什么问题。

    node ('slave_node') {
        checkout scm
        def customImage = docker.build("custom-image-name")
        customImage.inside {
            sh 'Inside Container'
            sh 'cat /etc/os-release'
        }
    }
    

    谢谢

    【讨论】:

      【解决方案3】:

      找到了另一种方法来实现这一点。 我们可以使用dockerfile函数本身与任何代理节点结合。

      示例如下

      #!/usr/bin/env groovy
      pipeline {
        agent {
          dockerfile {
            filename 'Dockerfile'
            label 'slave_node'
          }
        }
        stages {
          stage("example stage") {
            steps {
              script {
                sh 'cat /etc/os-release'
                sh 'curl --version'
                sh 'echo Successfully compiled'
              }
            }
          }
        }
      }
      

      来源可以在这里找到:syntax 并搜索关键字“dockerfile”以查找详细信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多