docker - 在 Openshift 中运行的 Docker 容器中安装并运行 docker

标签 docker jenkins openshift daemon okd

我目前正在研究以下场景

我正在尝试在 OpenShift 中设置一个运行 Jenkins 的容器,该容器本身能够运行 docker 来利用声明性管道,其中构建在其自己的 docker 容器中运行。这基本上使得需要在该容器内安装并运行 docker。

我已经为此工作了一段时间了。在网上检查了几十个帖子和线程,但我一直无法完成。到目前为止我基本上已经做到了

  • 我可以在我的容器中安装 docker(来自基本镜像 openshift/jenkins-2-centos7:latest)
  • 我无法让 docker 运行,因为它使用了 systemctl

现在我读到 systemctl 无法在 docker 容器内工作,或者至少非常不推荐,因为它会干扰系统中的 PID 1。没有

systemctl start docker

这将使我无法与守护进程连接(如预期)和错误消息

Can't connect to docker daemon. Is 'docker -d' running on this host?

所以我尝试使用自己设置守护进程

我的 Dockerfile 中有以下内容

RUN usermod -aG docker $(whoami)
RUN dockerd -H unix:///var/run/docker.sock

这也不起作用告诉我无法安装 cgroup。经过更多研究后,我发现这可以使用 cgroupfs-mount 脚本来处理

https://github.com/tianon/cgroupfs-mount/tree/master

但在这里我也没有运气,留下了以下错误

Error starting daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: iptables failed: iptables -t nat -N DOCKER: iptables v1.4.21: can't initialize iptables table `nat': Permission denied (you must be root) Perhaps iptables or your kernel needs to be upgraded.

现在下类后我已经没有主意了。有谁知道如何让 docker 在 OpenShift 中工作?真的会非常感激

最佳答案

I am trying to setup a container in OpenShift that runs a Jenkins that is itsself able to run docker to make use of declarative pipelines where the build is running in it's own docker container. This basically makes it necessary to install and run docker inside this container.

我不认为你在这里的结论是唯一的可能性,我下面将描述的是一种更简单的方法来获得(我认为)你想要的东西! :) 如果除了我将描述的这 3 个用例之外,您还有任何其他用例,请告诉我,我将尝试更新以涵盖它们:

  • 在自己的容器中运行的管道
  • 从管道运行其他容器
  • 从管道构建容器镜像
<小时/>

在自己的容器中运行的管道

对于本例,有出色的 Kubernetes plugin .

使用此插件,您可以将 Kubernetes/OpenShift 云添加到 Jenkins 全局配置中。这可以是 Jenkins 运行所在的集群(如果您使用 OpenShift 提供的 Jenkins 镜像,则至少会默认添加该镜像),也可以是外部集群。

在该配置中,您可以定义 PodTemplates(同样,OpenShift 提供的 Jenkins 镜像中提供了几个示例),或者我认为您也可以直接在管道中指定它。当您的管道请求具有与其中之一匹配的标签的节点/代理(并且没有匹配的长期运行代理)时,将从该模板创建一个 pod,并且您的管道执行将在该容器内进行。一旦不再需要,它将再次取消配置。

以下是此插件公开的管道步骤:https://jenkins.io/doc/pipeline/steps/kubernetes/

从管道运行其他容器

作为管道的一部分,您可能想要运行一些测试,并且这些测试可能期望能够与例如进行交互。一个数据库。您可以在 OpenShift 项目中为此创建资源(例如部署并通过服务公开它),然后将其拆除。 openshift-client plugin在这里非常有用,并且有关于如何与 OpenShift 交互的文档。

从管道构建容器镜像

如果您的目标是从管道构建容器镜像,请记住 OpenShift 还通过 Builds 公开此功能(取决于安全配置) 。就像上一节一样,您可以使用 openshift-client plugin创建并触发构建。

<小时/>

有关 OpenShift 维护的 Jenkins 镜像的更多信息(以及通常如何在 OpenShift 上的 Jenkins 中执行有用的操作),请访问 this dedicated page in the OpenShift docs .

关于docker - 在 Openshift 中运行的 Docker 容器中安装并运行 docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54464269/

相关文章:

node.js - 如何在 OpenShift 上的 Sails.js 中启用 CORS

kubernetes - 持久卷和OpenShift 3.11

angularjs - 如何在 tomcat 或 jboss 上部署我的 Angular 2 应用程序?

mysql - Laravel 与 docker 数据库错误 : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolve

ruby-on-rails - Rails Assets 未在Docker上加载

docker - Docker 镜像中不包含 wwwroot 中的静态文件

windows - 与远程 cmd 命令持续集成的解决方案?

jenkins - jenkins 脚本 dsl 中的 $class 语法

php - Composer Install (own Container) with Docker missing PHP Extensions

jenkins - 暂时停止运行 Jenkins 中的所有预定作业