我正在与 docker 和 jenkins 合作,我正在尝试做两个主要任务:
当我在网上冲浪时,我发现了许多解决方案:
所以我的问题是最好的解决方案是什么,或者您可以建议其他方法。
我听到的另一个关于在容器内运行容器的问题。这是一个好的做法还是更好地避免它?
将 Jenkins 作为容器化服务运行并不是一项艰巨的任务。有很多图像可以让您做到这一点。我只花了几分钟就让 Jenkins 2.0-beta-1 在容器中运行,从源代码编译(图像可以在这里找到)。特殊性我喜欢这种方法,你只需要确保使用数据卷或数据容器jenkins_home来让你的数据持久化。
当您想在容器中使用这个 Jenkins 来构建和管理容器本身时,事情会变得有点棘手。为了实现这一点,你需要实现一个叫做 docker-in-docker 的东西,因为你需要一个 docker 守护进程和 Jenkins 容器内可用的客户端。
有一个很好的教程解释了如何做到这一点:Docker in Docker with Jenkins and Supervisord。
基本上,您需要使用诸如 supervisord 之类的东西使两个进程(Jenkins 和 Docker)在容器中运行。它是可行的,并宣称具有良好的隔离性等......但可能非常棘手,因为 docker 守护进程本身有一些依赖项,这些依赖项也需要存在于容器内。因此,仅使用 supervisord 并运行两个进程是不够的,您需要利用DIND项目本身来使其工作……并且您需要在特权模式下运行容器……并且您”需要处理一些奇怪的 DNS 问题...
就我个人的喜好而言,让一些简单的工作听起来有太多的解决方法,并且在一个容器中运行两个服务似乎打破了 docker 的良好实践和关注点分离的原则,这是我想避免的。
当我读到这篇文章时,我的观点变得更加强烈:在您的 CI 或测试环境中使用 Docker-in-Docker?三思而后行。值得一提的是,最后一篇文章来自 DIND 作者本人,因此值得关注。
我的最终解决方案是:将 Jenkins 作为容器化服务运行,是的,但考虑将 docker 守护程序作为底层服务器配置的一部分,即使因为您的 docker 缓存和图像是您可能想要持久化的数据,并且它们是完全的由守护进程拥有和控制。
有了这个设置,你需要做的就是在你的 Jenkins 镜像中挂载 docker daemon socket(它也需要 docker 客户端,但不需要服务):
$ docker run -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v local/folder/with/jenkins_home:/var/jenkins_home namespace/my-jenkins-image
Run Code Online (Sandbox Code Playgroud)
或者使用 docker-composevolumes指令:
---
version: '2'
services:
jenkins:
image: namespace/my-jenkins-image
ports:
- '8080:8080'
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- local/folder/with/jenkins_home:/var/jenkins_home
# other services ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4986 次 |
| 最近记录: |