在Openshift

时间:2019-01-31 15:46:30

标签: docker jenkins openshift daemon okd

我目前正在处理以下情况

我正在尝试在OpenShift中设置一个运行Jenkins的容器,该容器本身可以运行docker来利用声明式管道,在该管道中,构建在其自己的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

这也不起作用,告诉我无法装载cgroup。经过更多研究后,我发现可以使用来自

的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内工作?真的很棒

3 个答案:

答案 0 :(得分:2)

您有Docker团队@jpetazzo的this article,大约Docker In Docker(DinD):

文章:

  

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

DinD回购:

  

由于@jfrazelle和@tianon等杰出人物的共同努力,这项工作现已过时了,他们也是将宜家家具组合在一起的黑带。

     

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

exports.uploadImage = functions.https.onRequest(async (req, res) => {
    cors(req, res, () => {
        cloudinary.config({
            cloud_name: 'config here',
            api_key: 'config here',
            api_secret: 'config here',
        });

        try { 
            const data = Object.apply({folder: 'myortho'}, req.body.options);
            const response = await cloudinary.uploader.upload(req.body.image, data);
            return res.send(response);
        } catch(error) {
            return res.send(500, {message: 'Error uploading image', error});
        }
    });
});

所以here是一篇使用另一种方法在Docker容器内使用Jenkins构建Docker容器的文章:

docker run --privileged -d docker:dind

因此,您可能要使此解决方案之一适合您的OpenShift方案。我希望它能解决您的问题。

答案 1 :(得分:2)

  

我正在尝试在OpenShift中设置一个运行Jenkins的容器,该容器本身可以运行docker来利用声明式管道,在该管道中,构建在其自己的docker容器中运行。从根本上来说,必须在此容器中安装并运行docker。

我不认为您的结论是唯一的可能性,下面我将描述的是一种更简单的方法来获得您想要的(我认为)! :)如果您有除上述3种情况之外的其他用例,请告诉我,我将尝试进行更新以涵盖它们:

  • 管道在各自的容器中运行
  • 从管道运行其他容器
  • 通过管道构建容器图像

管道在各自的容器中运行

在这种情况下,有出色的Kubernetes plugin

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

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

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

从管道中运行其他容器

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

从管道中构建容器图像

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


有关OpenShift维护的Jenkins映像(以及通常如何在OpenShift上的Jenkins中做有用的事情)的更多信息,请访问this dedicated page in the OpenShift docs

答案 2 :(得分:0)

您将需要一个运行jenkins的特权吊舱,该吊舱将openshift节点docker套接字挂载。这是一个坏主意,因为詹金斯会在kubernetes语义和控制之外启动容器。

为什么不使用openshift随附的s2i service

致谢。