在dev,qa,uat和production中提升docker镜像的最佳实践

时间:2018-02-21 19:55:19

标签: docker nexus continuous-deployment docker-image swarm

我们的应用程序是容器化的,并使用 docker swarm 作为协调器。我想了解我们如何从dev,qa,uat和生产中提升docker图像。例如,如果我在dev中创建的图像为 test:10 (10是由jenkins生成的内部版本号)。如何将相同的图像提升为qa,uat和production。我们目前正在使用 NEXUS 作为docker存储库。我不明白的是我将如何提取在开发环境中使用的确切图像。有人能帮忙吗。我很长时间与逻辑斗争:(

4 个答案:

答案 0 :(得分:3)

我刚刚写了一篇关于类似主题的博客文章。它特定于Azure DevOps YAML Pipelines的自动化,但涵盖了图像升级概念。看一下richminchuk.io。否则,您可以通过重新标记图像并推动以下操作,将图像从一个docker图像存储库提升到另一个:

docker build -t my-test .
docker tag my-test your-image-repository-dev/test:10
docker login "your-image-repository-url"
docker push your-image-repository-dev/test:10
# ... deploy/test your image in dev
docker pull your-image-repository-dev/test:10
docker tag your-image-repository-dev/test:10 \
           your-image-repository-qa/test:10
docker push your-image-repository-qa/test:10

然后,您将在QA docker映像存储库中拥有相同的映像。对于通过基本级别的单元/功能/用户接受测试的图像,这与没有通过图像测试的图像是有区别的!这里的关键概念是重新标记和推送图像的时间。此外,为每个docker映像存储库指定映像拉取凭据可以帮助您将实际可以创建的映像限制为特定环境。

上述策略的另一种选择是,您可能没有单独的docker映像存储库,并且可能选择更改映像名称而不是存储库。在这种情况下,您可以执行以下操作。

docker build -t my-test .
docker tag my-test your-image-repository/test:10
docker login "your-image-repository-url"
docker push your-image-repository/test:10
# ... deploy/test your image in dev
docker pull your-image-repository/test:10
docker tag your-image-repository/test:10 \
           your-image-repository/test-qa:10
docker push your-image-repository/test-qa:10

答案 1 :(得分:0)

解决此问题的一种方法是使用CI / CD工具(例如Jenkins),甚至使用某些CI / CD bash脚本,并具有某种标记策略。如您所知,您可以为同一张图片添加不同的标签。例如,您可以将内置的图像ID设置为0000,并对其进行多次标记,如下所示:

Day 1:
| TAG         | IMAGE ID |
| test:10     | 00000000 |
| test:dev-latest | 00000001 |
| test:qa-latest  | 00000001 |
| test:prod-latest| 00000001 |    

Day 2:
| TAG             | IMAGE ID |
| test:10         | 00000000 |
| test:11         | 00000001 |
| test:dev-latest | 00000001 |
| test:qa-latest  | 00000001 |
| test:prod-latest| 00000001 |

您的协调器总是可以等待新图像被标记。该方法理论上是有用的。但是,根据您的容器协调器特定功能,您可以稍微改进此方法以使用那些特定功能。例如,图像提取策略或推出和回滚功能,实施蓝/绿策略的功能等。

答案 2 :(得分:0)

关键是在图像标签中使用某种形式的元数据来指示图像对应于部署过程的哪一步。有很多潜在的方法可以做到这一点,但也许先看看SemVer,因为它是一个有据可查且广泛使用的选择。

https://semver.org/

semver中主要要注意的是在版本中使用-标记,这表示某事物是“预发行”版本。

考虑到这一点,很容易将制作图像和非制作图像分开:

  • 生产版本:nginx:1.2.3
  • 非生产版本:nginx:1.2.3-10

从那里,如果需要,您可以使用“点分隔的预发行标识符”进一步细分非生产版本

  • dev:nginx:1.2.3-dev.10
  • qa:nginx:1.2.3-qa.10
  • 燕麦nginx:1.2.3-uat.10

您还可以使用其他标记方法,但是SemVer有据可查,广泛并且可以解决问题。

答案 3 :(得分:0)

最佳做法是为每个环境拥有一个单独的容器存储库。 Azure 容器注册表可能不需要将 Docker 拉入构建/发布代理。 我写了一篇关于这个的文章 promoting-container-images-to-production-using-azure-devops