我目前正在处理以下情况
我正在尝试在OpenShift中设置一个运行Jenkins的容器,该容器本身可以运行docker来利用声明式管道,在该管道中,构建在其自己的docker容器中运行。从根本上来说,必须在此容器中安装并运行docker。
我已经研究了很长时间了。在线检查了数十个帖子和主题,但我无法完成。基本上我已经到了
现在,我了解到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内工作?真的很棒
答案 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?
致谢。