【发布时间】:2019-06-08 23:17:56
【问题描述】:
我在一些项目中使用 Git 已有几年了,但我是 Docker 新手。
今天,我想找到一个工作流程,让我可以在我的团队项目中正确使用 Git 和 Docker。
今天
今天,没有 Docker,我们使用命名分支进行开发。当功能完成后,我们将它们拉向“master”。当我们想要投入生产时,我们会创建一个 master 的版本化 preprod 分支(例如 preprod-2.3.0)用于测试。如果我们有更正,我们会推送当前的 preprod 并合并到 master。当 preprod 分支准备好(自动和手动测试)时,我们创建一个与 preprod 版本相同的 prod 分支(例如:prod-2.3.0)。如果我们在 prod 中有紧急更正,我们会从 preprod(例如:preprod-2.3.1)创建一个新分支,然后继续正常流程(test + prod -> prod-2.3.1)。
使用 Docker
使用 Docker,为了开发,我们想要创建名为 $PROJECT_NAME/$IMAGE_NAME:dev (project/api:dev, project/db:dev, project/webui:dev...) 的本地镜像。 每次我们重建本地项目时,我们都会丢失开发映像,否则它将变得无法管理。 为了测试,我们还会使用 dev 的版本。
但我有疑问的是产品发布。
一些博客/文章在将代码推送到 git 后创建 docker 图像,执行单元测试并最终保存有效图像。此后,一个有效的图像将被命名为“:latest”并用于生产实施。 在我们的例子中,我们可以使用这个系统来保存 prod-$VERSION 分支的有效图像,使用 $VERSION 和 latest 标签来对图像进行版本控制。
问题
我对这个系统的问题是我觉得我正在失去 Docker 的好处之一。当我在本地执行测试时,我会测试代码以及开发映像。应该在 CI 和生产环境中使用此映像。在那里,CI 为 master、preprod 和最后的 prod 重新创建了几次图像,然后被冻结。 如果集线器映像的版本(例如 nginx:latest、node:lastest)同时发生了变化,这可能会导致问题。 见:https://nickjanetakis.com/blog/docker-tip-18-please-pin-your-docker-image-versions
另一种解决方案是使用 preprod 标签将图像直接保存在 preprod 中。经过测试,我添加了标签“prod”和“latest”。但是如果在创建 preprod 的过程中发生了更新,我有时会浪费时间来理解为什么它在 dev 而不是 prod 中起作用。但至少避免了前期制作和制作之间的问题。
我在 nodejs 锁 (package.json/package-lock.json) 上也找不到允许运行 npm build/npm ci 的系统(下载最新版本的包并更新锁定文件,指定哪个版本被精确地使用/重建了与锁定文件相同的架构)。 见:https://docs.npmjs.com/files/package-lock.json
问题
您是否有确保图像与前一个相同的系统/想法(作为锁)? 还是允许您在团队中工作,同时直接从开发人员(带有版本)删除图像的工作流程?
【问题讨论】:
-
你使用什么 CI?
-
现在,我有
-
当你说“如果集线器镜像的版本(例如 nginx:latest, [node:latest])在此期间发生了变化,这可能会导致问题”,你的意思是你想要这些事情要改变(因为您团队中的其他人改变了它们)还是您不希望这些事情发生变化(它们是破坏事情的上游变化)?
-
啊,既然你指定
latest,我想你的意思是后者。在这种情况下,您是否尝试过锁定到特定的图像摘要?例如,我的一个来自 Docker Hub 的 Ubuntu 映像可以锁定到ubuntu@sha256:338782553ef7821eb0063d08273f6b5dc71b5202f65d6388998750e7e327b088,这将保证上游依赖项没有任何变化。不利的一面是,当我有时间测试较新的图像时,我必须记住在某个时候将其提高。 -
啊,我明白了。您可以拥有一个从开发中生成图像并将其推送到注册表的系统。对于 dev 以外的任何环境,重新使用构建的镜像,不要重新构建。这样一来,您就不必担心非开发环境会潜入开发人员未看到的上游更改。
标签: git docker workflow dev-to-production