如何testing和部署Docker生产映像?

我正在开发Ruby on Rails,并开始使用Docker进行一个月的部署。

以下是我正在处理的步骤。

  1. 开发我的笔记本电脑
  2. 推到gitlab
  3. build立一个包括testing和生产gem的图像
  4. 对此图像运行rspec
  5. (通)推送到registry,(失败)丢弃图像

有了这个工作stream程,我将拥有一个拥有所有testing,开发和生产gem的图像。

我从与许多人交谈中find的工作stream程

  1. 在我的膝盖上开发
  2. 推到gitlab
  3. build立testing图像(testing所需的所有gem)
  4. 对testing图像运行rspec
  5. (通过)构build另一个图像部署没有testinggem,推到dockerregistry,(失败)丢弃图像

用这种方法,我认为这是违反了Docker的目的(被testing的图像应该与将被部署的图像无关)。

如何指定和实施testing和推送生产映像的方法?

正如Alexei Ledenev的 “ Docker容器testing策略 ”中提到的 ,您的第一种方法具有明显的缺点:

  • 增加图像大小 – 因为它包含testing工具,所需的软件包,testing脚本甚至testing数据
  • 使用特定于testing的configuration污染图像运行时环境,甚至可能引入不需要的依赖项(集成testing需要)
  • 我们还需要决定如何处理testing结果和日志。 如何和在哪里出口他们

一个不同的方法(接近你提到的第二个方法)是制作一个“testing感知容器”:

我们认为Docker应该将Docker docker-test作为容器pipe理生命周期的一部分。

如前所述,Docker有一个非常有用的ONBUILD指令 。 这个指令允许我们在成功的构build中触发另一个构build指令。
基本思想是在运行ONBUILD docker-test命令时使用ONBUILD指令。

docker-test命令执行的stream程:

docker-test将search应用程序Dockerfile中的ONBUILD指令,将…

  • 从原始的Dockerfile生成一个临时的Dockerfile
  • 执行docker build -f Dockerfile.test [OPTIONS] PATH build命令支持附加选项的docker build -f Dockerfile.test [OPTIONS] PATH : – 将自动附加到tag选项的testing
  • 如果构build成功,执行docker run -v ./tests/results:/var/tests/results [OPTIONS] IMAGE:TAG-test [COMMAND] [ARG...]
  • 删除Dockerfile.test文件

(本文继续描述集成testing容器)