我正在开发Ruby on Rails并开始使用Docker进行一个月的部署。
以下是我正在处理的步骤。
- 开发我的笔记本电脑
- 推送到gitlab
- 构建包含测试和生产宝石的单个图像
- 针对此图片运行rspec
- (传递)推送到注册表,(失败)丢弃图像
醇>
通过这个工作流程,我将拥有一个包含所有测试,开发和生产宝石的图像。
我通过与很多人交谈找到的工作流程
- dev on my lap top
- 推送到gitlab
- 构建测试图像(测试所需的所有宝石)
- 针对测试图片运行rspec
- (传递)构建另一个没有测试宝石的部署映像并推送到docker注册表,(失败)丢弃图像
醇>
使用这种方法,我认为它违反了Docker的目的(正在测试的图像应该与将要部署的图像无差异。)
如何指定和实施测试和推送生产图像的方法?
答案 0 :(得分:3)
正如Testing Strategies for Docker Containers中“Alexei Ledenev”所述,您的第一种方法存在明显缺陷:
- 增加图像大小 - 因为它包含测试工具,所需的包,测试脚本,甚至可能包含测试数据
- 使用特定于测试的配置污染映像运行时环境,甚至可能引入不需要的依赖项(集成测试需要)
- 我们还需要决定如何处理测试结果和日志;如何以及在何处出口
另一种方法(更接近您提到的第二种方法)是制作“测试感知容器”:
我们认为Docker应该使
docker-test
成为容器管理生命周期的一部分。如前所述,Docker有一个非常有用的
ONBUILD
instruction 。该指令允许我们在后续构建中触发另一个构建指令 基本思想是在运行ONBUILD
命令时使用docker-test
指令。
docker-test
命令执行的流程:
docker-test
将在应用程序Dockerfile中搜索ONBUILD
指令,并将...
- 从原始
生成临时Dockerfile.test
Dockerfile
- 使用docker build命令支持的其他选项执行
docker build -f Dockerfile.test [OPTIONS] PATH
:-test
将自动附加到tag
选项- 如果构建成功,请执行
docker run -v ./tests/results:/var/tests/results [OPTIONS] IMAGE:TAG-test [COMMAND] [ARG...]
- 删除
Dockerfile.test
文件
(文章继续描述集成测试容器)