4

我目前正在处理以下场景

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

我已经研究了很长时间了。在网上查了几十个帖子和线程,但我没能完成它。基本上我到目前为止

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

现在我读到 systemctl 不能在 docker 容器中工作,或者至少是高度不推荐的,因为它会干扰系统中的 PID 1。没有

systemctl start docker

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

无法连接到 docker 守护进程。'docker -d' 是否在此主机上运行?

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

我的 Dockerfile 中的以下内容

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

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

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

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

启动守护程序时出错:初始化网络控制器时出错:获取控制器实例时出错:无法创建 NAT 链 DOCKER:iptables 失败:iptables -t nat -N DOCKER:iptables v1.4.21:无法初始化 iptables 表“nat”:权限被拒绝(您必须是 root)也许需要升级 iptables 或您的内核。

现在下班后我没有想法。有谁知道如何让 docker 在 OpenShift 内部工作?真的很棒

4

3 回答 3

2

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

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

  • 在自己的容器中运行的管道
  • 从管道运行其他容器
  • 从 Pipelines 构建容器镜像

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

对于这种情况,有出色的Kubernetes 插件

使用此插件,您可以将 Kubernetes/OpenShift 云添加到 Jenkins 全局配置中。这可以是运行 Jenkins 的那个(如果您使用 OpenShift 提供的 Jenkins 映像,至少默认情况下会添加它),也可以是外部集群。

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

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

从管道运行其他容器

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

从 Pipelines 构建容器镜像

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


有关 OpenShift 维护的 Jenkins 映像的更多信息(以及通常如何在 OpenShift 上的 Jenkins 中做有用的事情),请参阅 OpenShift 文档中的这个专用页面

于 2019-02-01T13:58:00.730 回答
2

你有这篇来自 Docker 团队的 @jpetazzo 的文章,关于Docker In Docker (DinD):

文章:

Docker-in-Docker 的主要目的是帮助 Docker 本身的开发。许多人使用它来运行 CI(例如使用 Jenkins),起初看起来不错,但他们遇到了许多“有趣”的问题,这些问题可以通过将 Docker 套接字绑定安装到您的 Jenkins 容器中来避免。

DinD 回购:

这项工作现在已经过时了,这要归功于@jfrazelle 和@tianon 等一些了不起的人的共同努力,他们也是将宜家家具组合在一起的黑带。

如果您想在今天运行 Docker-in-Docker,您需要做的就是:

docker run --privileged -d docker:dind

所以这里有一篇文章使用另一种方法在 docker 容器中使用 Jenkins 构建 docker 容器:

docker run -p 8080:8080 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --name jenkins \
  jenkins/jenkins:lts

因此,您可能希望将其中一种解决方案适应您的 OpenShift 场景。我希望它能解决你的问题。

于 2019-01-31T17:10:55.740 回答
0

您需要一个运行 jenkins 的特权 pod,它安装 openshift 节点 docker 套接字。这是一个坏主意,因为 jenkins 将在 kubernetes 语义和控制之外启动容器。

为什么不使用openshift附带的 s2i 服务?

问候。

于 2019-01-31T17:16:40.807 回答