docker - 如何使 docker 镜像保持最新?
问题描述
我对 docker 还很陌生,并尝试实现自动化部署。据我了解,容器永远不应该更新。在更新的情况下,需要创建新图像 (1) 并且需要用新实例替换正在运行的容器 (2)。
我通过使用containrrr/watchtower 解决了挑战2。这似乎是唯一(?)仍然维护的自动更新我的容器的软件。
挑战 1 稍微复杂一些。对于直接来自 docker hub 的图像,除了希望包维护者定期更新之外,我无能为力。但是在某些情况下,来自 docker hub 的图像是不够的,通常建议创建派生图像。有时一开始就没有维护图像。对于这两个用例,我都设置了 Jenkins 管道,这些管道构建图像并将它们推送到我的私有 docker 存储库中,由瞭望塔监控。到目前为止,一切都很好。
但是如何在我的 Jenkins 管道上设置触发器以使其保持最新状态?
可能的来源:
- VCS (SVN/GIT):由 Jenkins 轻松处理。
- Docker Hub(用于派生图像或基础):我发现的唯一解决方法是创建一个带有虚拟 Github 存储库的虚拟 Docker Hub 存储库,自动构建存储库链接(“启用基础映像”),然后是我的 Jenkins 实例的 Web 挂钩(“CloudbDocker Hub/注册表通知插件”)
- 包更新(安装在 docker 文件中。例如通过 apk/apt):在这里我还没有找到任何解决方案。
我很惊讶没有关于这个主题的更多信息。关于如何初始设置 docker 和 Jenkins 有很多很棒的指南,它们显示了入门是多么容易,但没有关于如何长时间运行容器的内容。对于许多开发人员来说,我认为这不是问题,因为源代码中有许多更新会经常触发更新,但是所有定制图像呢?
这是一个实际的差距还是我错过了一个重要的信息?
解决方案
据我了解,容器永远不应该更新。在更新的情况下,需要创建新图像 (1) 并且需要用新实例替换正在运行的容器。
我们先简单介绍一下 docker:
Docker 提供了在称为容器的松散隔离环境中打包和运行应用程序的能力。隔离和安全性允许您在给定主机上同时运行多个容器。更多信息:Docker 文档
将容器视为虚拟机是一种常见的误解,但 docker 不是一种虚拟化技术,它是一种应用程序交付技术。容器的抽象是你的应用程序运行的服务,一旦进程结束,docker容器就停止了。
每个容器都有自己的隔离环境,为服务运行的需要做好准备。This is one of the main benefits of docker, you can REPLICATE the environment of the application to run.
进行此快速介绍是为了了解 docker 的这种好处,作为澄清您的问题的基础。考虑到这一点,让我们看看你的问题:
- 对于直接来自 docker hub 的图像,除了希望包维护者定期更新之外,我无能为力
为什么需要直接从 docker hub 中更新正在运行的容器?
想象一下,您正在使用 postgres 映像在服务器中运行数据库。其他容器需要与这个 postgres 容器通信,所以它需要访问这个 db。您的应用程序使用当前图像版本按预期工作。有一个新的可用版本的 postgres 映像,您的系统更新了容器,并且由于某种原因,容器的行为与以前的版本不同,并且一旦容器更新,您的应用程序由于某种原因而失败。
这里的主要内容是更新容器应该遵循标准,了解应用程序的需求,并始终有办法测试更新后的版本是否符合您的预期。另一方面,如果您在没有任何标准且没有先前断言整个应用程序的情况下自动更新,则您没有利用环境复制。
- 但是在某些情况下,来自 docker hub 的图像是不够的,通常建议创建派生图像
这与第一点密切相关。由于我想为应用程序需求创建我的隔离环境,我需要选择合适的基础镜像来构建我的最终镜像。我只会在特定标准下更新此基础映像。
想象一下,我想为 java 应用程序创建一个容器。我将使用官方 java 镜像作为基础镜像。我会选择适合我项目的 sdk 的镜像版本。如果此映像针对较新的 sdk 自动更新,则可能会破坏应用程序的当前行为。
但是如何在我的 Jenkins 管道上设置触发器以使其保持最新状态?
有了之前所有的澄清,答案是:这应该是一个手动步骤,根据容器服务需求的标准完成,并且有办法测试这个新的镜像版本,作为最终镜像的基础镜像,或者直接用于您的系统,不会破坏您的应用程序或系统行为。
我使用环境复制 docker 的好处来回答你的问题,但是还有很多其他的 docker 功能、标准流程和其他发挥重要作用的东西,这将使答案变得更长。我希望这可以很好地介绍您的问题。
我鼓励您阅读有关编写 docker 映像的最佳实践以及其他有关 docker 的有趣博客,以更好地了解使用该技术的好处,并获得知识,以便答案更有意义。我将在下面留下几个有趣的链接:
推荐阅读
- java - 自定义 AlertDialog 的透明背景
- powershell - 当 CPU 平均利用率超过 90% 持续 30 分钟时,如何获取电子邮件警报?
- c - 使用 Jansson API 编辑 json 对象
- python - 清除当前图形后,为什么窗口中有占用空间?
- hyperledger-fabric - 对等管理卡不存在错误,JSON 输入意外结束
- python - 跨平台 Pipenv.lock
- python - 我正在尝试在谷歌地图上绘制带有悬停文本的多边形
- javascript - React axios 不工作它说编译失败
- perl - 如何在被调用函数之间正确传递变量?
- jenkins - Sonar Scanner 选项可将项目属性值包含在脚本化管道本身中