在 Jenkins 从节点上运行的 Jenkinsfile 中执行 docker build 命令的最简单方法?

2023-11-26

我希望 Jenkinsfile 执行的操作的基本示例:

node {
   sh 'docker build -t foo/bar .'
}

看来我需要将 docker 安装到正在执行 Jenkinsfile 的 Jenkins 从属映像上。有一个简单的方法可以做到这一点吗? (Jenkins 从属镜像本身就是一个 docker 容器)

我的假设正确吗?

  1. 当与 Jenkins 主/从机一起运行时,Jenkinsfile 由 Jenkins 从机执行
  2. 通过“管理插件”部分安装的 Jenkins 插件(例如 Docker 插件或 Gcloud SDK 插件)仅安装在 Jenkins 主服务器上,因此我需要手动构建 Jenkins 从属 docker 映像并在映像上安装 docker?

由于我还需要访问“gcloud”命令(我通过 Kubernetes Helm/Charts 运行 Jenkins),所以我一直在使用gcr.io/cloud-solutions-images/jenkins-k8s-slave我的詹金斯奴隶的图像。

目前它错误地显示“docker:未找到”


我的假设是你想要docker build在 Jenkins Slave 内部(这是一个 Kubernetes Pod,我假设是由Kubernetes Jenkins 插件)

为了做好准备,当 Kubernetes 创建充当 Jenkins 从站的 pod 时,您在该节点内执行的所有命令都将在该 Kubernetes pod 的其中一个容器内执行(默认情况下只有一个容器,但是稍后会详细介绍)。

所以你实际上是在尝试在基于以下内容的容器内运行 Docker 命令gcr.io/cloud-solutions-images/jenkins-k8s-slave,这很可能基于官方 Jenkins JNLP Slave, 其中不包含 Docker!

从现在开始,您可以采取两种方法:

  • 使用基于 JNLP 从属的稍微修改的映像,该映像还包含 Docker 客户端并安装 Docker 套接字(/var/run/docker.sock)在容器内。 (您可以在此处找到有关此方法的详细信息). 这是包含 Docker 客户端和kubectl.

以下是如何配置 Jenkins 插件的完整视图:

enter image description here

请注意,您使用不同的映像(您可以创建自己的映像并在其中添加所需的任何二进制文件),并且将 Docker 套接字安装在容器内。

  • 第一种方法的问题在于,您需要创建一个从官方 JNLP 从属分支派生的新映像,并手动添加 Docker 客户端。这意味着每当 Jenkins 或 Docker 有更新时,您都需要手动更新镜像和整个配置,这是不可取的。 使用第二种方法时,您始终使用官方图像,并且您使用 JNLP Slave 启动同一 Pod 中的其他容器。

这是下图中的完整文件

这是执行此操作的 Jenkins 插件文档

enter image description here

正如我所说,JNLP 映像将启动您在同一 pod 中指定的容器。请注意,为了从容器中使用 Docker,您仍然需要安装 Docker sock。

这是我发现的两种在容器内运行的 Jenkins JNLP 从属设备中构建映像的方法。

该示例还展示了如何使用 Jenkins 的凭证绑定推送映像,以及如何在构建过程中更新 Kubernetes 部署。

更多资源:

  • 将 Jenkins 作为 Helm Chart 部署到 Kubernetes,配置要安装的插件

谢谢, 拉杜中号

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Jenkins 从节点上运行的 Jenkinsfile 中执行 docker build 命令的最简单方法? 的相关文章

随机推荐

  • 自动 XSD 验证

    根据 lxml 文档 DTD 是根据解析文档的 DOCTYPE 自动检索的 您所要做的就是使用启用了 DTD 验证的解析器 http lxml de validation html validation at parse time 但是 如
  • 简单的日志文件格式

    我不确定是否有人问过 但我找不到这样的东西 我的程序使用一个简单的 txt 文件用于日志目的 它只是创建 打开一个文件并附加行 一段时间后 我开始记录相当多的活动 因此文件变得太大并且难以读取 我知道 这不是写的方式来做到这一点 但我只需要
  • 在网页中嵌入视频 (HTML)

    我想在网页中嵌入视频 我不想使用 Flash 因为它不适用于大量平台 我不愿意使用 HTML5 因为它还不太标准 它是标准 但大多数人没有支持它的浏览器 还有其他办法吗 或者我应该坚持使用 HTML5 和一个巨大的横幅告诉人们升级他们的浏览
  • ASP.NET ConnectionString AttachDbFilename=|数据目录|

    这是关于 ConnectionStrings ASP NET MVC 与 Visual Studio 2012 Ultimate 和 SQL Server Express 2012 的内容 在此继续本教程 http www asp net
  • 与伞式框架的链接

    我有 ios 应用程序 我想在其中实现 Flurry analytics 导入 Flurry 并 ling libsystem network dylib 后 我遇到了这个无法解决的问题 ld cannot link directly wi
  • Django/mod_wsgi OSError: [Errno 13] 权限被拒绝: 当 DEBUG = OFF 时为“静态”

    我在 Centos 6 2 服务器 运行 apache mysql php 上有一个 Django 1 4 应用程序 使用 mod wsgi 并将我的项目部署在虚拟环境中 该应用程序本身是我在托管服务上使用多年的应用程序 现在我正在自己的机
  • next.js getStaticPaths 列出每个路径还是仅列出附近的路径?

    使用 Next js 导出静态页面 我在动态路由中得到了这样的结果pages id js我放入的任何路径getStaticPaths将创建部分 凉爽的 列出每一页是否更好 getStaticPaths return some functio
  • 将 Powerpoint 演示嵌入到 C# 应用程序中

    我希望能够将 powerpoint 演示文稿嵌入到 C 表单 WinForms 中 基本上我们有一台 52 英寸的显示器 其想法是在一个角落循环播放 PPT 然后其他 3 个角落将显示程序本身的信息 我原以为这会很简单 但看来我错了 有人建
  • Windows 文件路径路径中的空格

    我正在使用 python 进行文件操作 我的文件路径为 filepath E ABC SEM 2 testfiles all txt 当我使用 python 打开文件时 它说 IOError No such file 但是 该文件存在于驱动
  • 如何在重定向到外部页面之前在 jquery 中预加载(缓存)该页面?

    我正在做一个phonegap应用程序 我有一个 index html 页面 其中有一个重定向到网站应用程序的登录按钮 当点击登录按钮时 我想要一个加载 gif 来显示页面 正在被缓存 预加载并在完成后重定向到页面 我希望有一个示例脚本代码
  • 改变material-ui按钮的字体大小,并让按钮缩放?

    我似乎在更改 Material UI 用于 React RaishedButton 上的字体大小以及让按钮本身与其正确缩放时遇到问题
  • Visual Studio 中的静态和动态链接

    我理解静态和动态链接的概念 据了解 在Windows平台上 dll是动态库和 lib是静态库 我的困惑 我做了一个必须使用 OpenCV 库的项目 基本上 我必须使用以下 5 个 OpenCV 库 lopencv core lopencv
  • jQuery $.post 和 json_encode 返回一个带有引号的字符串

    我正在使用 jQuery 的 post 调用 它返回一个带有引号的字符串 引号是由 json encode 行添加的 如何阻止添加引号 我在 post 通话中遗漏了什么吗 post getSale php function data con
  • 检查表是否存在[重复]

    这个问题在这里已经有答案了 我有一个桌面应用程序 其中嵌入了数据库 当我执行程序时 我需要检查特定的表是否存在 如果不存在则创建它 给定我的数据库的名为 conn 的 Connection 对象 我如何检查它 DatabaseMetaDat
  • JavaScript 执行连接到 mongoHQ shell 失败

    尝试直接访问 MongoHQ gt mongo mongodb heroku email protected 10046 myapp MongoDB shell version 2 4 3 connecting to mongodb her
  • 是否可以通过编程方式清除控制台历史记录?

    使用控制台应用程序时 在某个位置输入的所有内容的历史记录Console ReadLine 被储存了 当控制台提示输入某些内容时 按向上 向下光标将滚动浏览此历史记录 并且可以通过按 F7 查看整个历史记录 使用 C 是否有办法禁用此行为或清
  • 从 YouTube 网址获取持续时间

    我正在寻找一个函数 可以从 url 中提取视频的 YouTube 持续时间 我读了一些教程但不明白 我使用网址在我的网站上嵌入视频 并且我有一个提取缩略图的功能 我只想要类似的东西来获取持续时间 这是我如何获得拇指 function get
  • iOS:应用程序内购买管理多个自动续订订阅,具有升级和降级选项

    我们正在为 iPhone 开发一款 iOS 应用程序 该应用程序将具有免费功能 并且该应用程序将具有高级功能 其中有 4 个应用程序内购买自动续订订阅选项 如下所示 单月订阅 单年订阅 家庭包月 家庭每年订阅 我们将在应用程序内有一个商店屏
  • Flask 下载文件

    我正在尝试使用 Flask 创建一个网络应用程序 让用户上传文件并将其提供给另一个用户 现在 我可以将文件上传到上传文件夹正确 但我似乎找不到一种方法让用户下载回来 我将文件名存储到数据库中 我有一个为数据库对象提供服务的视图 我也可以删除
  • 在 Jenkins 从节点上运行的 Jenkinsfile 中执行 docker build 命令的最简单方法?

    我希望 Jenkinsfile 执行的操作的基本示例 node sh docker build t foo bar 看来我需要将 docker 安装到正在执行 Jenkinsfile 的 Jenkins 从属映像上 有一个简单的方法可以做到