当前位置: 首页 > 知识库问答 >
问题:

Jenkins容器agent是如何在没有docker的情况下依然可以运行docker命令的?

吕俊才
2023-11-29

为什么我的Jenkins容器agent可以在容器内并没有docker的情况下,在流水线内依然可以运行docker? jenkins是如何做到的?

本来是我一直把docker以及docker.sock挂载到容器中去的,今天突发奇想去掉了挂载,发现依然可以执行,真的很神奇。

这AI的回答没太看懂,什么叫容器里即便没有docker,但jenkins代理安装了docker, jenkins agent不是运行在这个临时run起来的容器中的么。

我使用docker agent templet来执行job。
image.png

这里是我在一个流水线的执行过程中,进入到容器里,可以看到容器里是没有docker的。
image.png
但神奇的是,流水线中代码的 sh'docker xxxx' ,是可以执行的。
image.png

同时还有一点神奇的,在同一个jenkins集群内,我为多个docker host都配置了同样的agent templet,区别是lable不同,当我调度docker host为其他主机的label, 流水线里执行sh'docker info' ,可以观察到,无论容器最终在哪个docker host上执行,流水线内通过docker info可以看到,docker.sock都是指向同一台主机的。

共有1个答案

阳修永
2023-11-29

首先,让我们了解一下Jenkins和Docker的基础知识。

Jenkins是一个持续集成/持续部署工具,它支持在多个容器中运行任务。这些容器可以用于执行各种任务,包括构建、测试和部署应用程序。Jenkins通过使用代理(agent)来管理和监控这些容器。

Docker是一个开源平台,用于打包、分发和运行应用程序。它使用容器化技术来打包应用程序及其所有依赖项,并使其易于部署和扩展。

在您的情况下,即使容器中没有安装Docker,Jenkins仍然能够在流水线中执行Docker命令。这是通过在Jenkins代理上安装Docker命令行工具实现的。Docker命令行工具是一个可执行文件,可以在没有安装Docker的情况下执行Docker命令。

当您在流水线中执行sh'docker xxxx'时,Jenkins代理将在其上执行该命令。由于Jenkins代理上已经安装了Docker命令行工具,因此它可以执行这些Docker命令,而无需在容器中安装Docker本身。

至于您提到的docker.sock指向同一台主机的问题,这可能是因为Jenkins代理在所有容器中共享了相同的Docker守护进程。当您在流水线中执行Docker命令时,这些命令实际上是在Jenkins代理上执行的,而不是在容器本身上执行的。因此,无论容器在哪个Docker主机上执行,Docker命令都会通过Jenkins代理进行中转,并使用共享的Docker守护进程来执行。

总结一下,Jenkins能够在没有安装Docker的情况下执行Docker命令,是通过在Jenkins代理上安装Docker命令行工具实现的。而无论容器在哪个Docker主机上执行,Docker命令都会通过Jenkins代理进行中转,并使用共享的Docker守护进程来执行。

 类似资料:
  • 问题内容: 我想像运行shell命令: 不用任何插件就能做到吗?由于Jenkins不是,而是服务帐户,我该如何添加? 问题答案: 首先执行 然后执行 然后注销 对于注销很重要,因为您需要重新评估组成员身份 登录并重试 有用!

  • 我有一个docker撰写文件,它看起来像: 我正在为其他人构建的raspberry pi使用mongoDB容器(我刚刚从docker hub中提取),问题是如果由于任何原因出现不正确的关闭,容器无法处理mongod。锁定/data/db目录中的文件。 在这种情况下,在尝试重新启动所有容器时,mongodb容器将保持退出状态,状态代码为100,唯一的修复方法是通过运行sudo rm/data/db/

  • 问题内容: 我正在研究Centos7。我有一个运行Jenkins的Docker容器。在那个Jenkins容器中,我必须构建并运行其他Docker容器。但是詹金斯不认识码头工人。我能够执行一个shell并将docker安装在容器中。但是,是否有可能让容器在主机上使用我的docker- engine?如何使用? 在Jenkins-(docker)-容器中安装Docker的最佳选择是什么? 问题答案:

  • 我只需要"解除屏蔽"我的终端后...有一些选项或setpup为它? 注意:我的服务正在使用,因此假设不需要在命令行上使用。 PS:我需要保持容器运行,我不需要使用

  • 问题内容: 我在Docker容器上安装了Nginx,并且正在尝试像这样运行它: 问题在于Nginx的工作方式,即初始进程会立即产生一个主要的Nginx进程和一些工作程序,然后退出。由于Docker仅监视原始命令的PID,因此容器将暂停。 如何防止容器停止?我需要能够告诉它绑定到第一个子进程,或者阻止Nginx的初始进程退出。 问题答案: 像所有行为良好的程序一样,可以配置为不自我守护。 使用htt

  • 问题内容: 我使用第三方GUI(Synology Docker软件包)来设置Docker容器。但是,它的局限性使我需要从命令行运行容器。(我想映射另一个主机IP绑定端口) 现在,由于已经完成了许多设置,因此我想检索启动该容器的原始运行命令,然后可以将端口映射端口更改为新端口。例如。“ ” 我找不到这样做的方法,事件使用“ docker inspect”,没有提供此类信息。 请提供一些建议以解决此问