【发布时间】:2021-04-08 14:37:18
【问题描述】:
我对 docker 还很陌生,并尝试实现自动化部署。 据我了解,容器永远不应该更新。在更新的情况下,需要创建新图像 (1) 并且需要用新实例替换正在运行的容器 (2)。
我通过使用 containerrrr/watchtower 解决了挑战 2。这似乎是唯一(?)仍然维护的自动更新我的容器的软件。
挑战 1 有点复杂。对于直接来自 docker hub 的图像,除了希望包维护者定期更新之外,我无能为力。但是在某些情况下,来自 docker hub 的图像是不够的,通常建议创建派生图像。有时一开始就没有维护图像。对于这两个用例,我都设置了 Jenkins 管道,这些管道构建图像并将它们推送到我的私有 docker 存储库中,由瞭望塔监控。 到目前为止,一切顺利。
但是如何在我的 Jenkins 管道上设置触发器以使其保持最新状态?
可能的来源:
- VCS (SVN/GIT):由 Jenkins 轻松处理。
- Docker Hub(对于派生图像或基础):我发现的唯一解决方法是创建一个带有虚拟 Github 存储库的虚拟 Docker Hub 存储库,自动构建存储库链接(“启用基础映像”),然后我的 Jenkins 实例的网络挂钩(“CloudbDocker Hub/Registry Notification 插件”)
- 包更新(安装在 docker 文件中。例如通过 apk/apt):这里我还没有找到任何解决方案。
我很惊讶没有关于这个主题的更多信息。关于如何初始设置 docker 和 Jenkins 有很多很棒的指南,它们显示了入门是多么容易,但没有关于如何长时间运行容器的内容。 对于许多开发人员来说,我认为这不是问题,因为源代码中有许多更新会经常触发更新,但是所有定制图像呢?
这是一个实际的差距还是我错过了重要的信息?
【问题讨论】:
-
源代码通常在 apt/yum 命令之后添加到容器中,因此在使用源代码更改重建图像时,这些层不会得到更新
-
如果您希望始终拥有最新的基础镜像,只需每天重建您的容器即可。如果基础映像没有更改,则构建将与前一个相同,并且不会发生任何变化。然而,这不是生产系统的工作方式。您通常从基础映像的固定版本构建以确保稳定性,而不是从最新版本构建。
-
@OneCricketeer 您可以在没有缓存的情况下构建,以确保您始终拥有最新的软件包。然而,这是一项昂贵的重建任务。
-
@BurakSerdar 许多官方存储库提供标签以避免兼容性问题。每天在没有缓存的情况下重建容器是唯一可行的解决方案,但是由于这会产生很多不必要的开销,因为无论是否有更改,所有容器都会每天更新
标签: docker jenkins docker-registry