Docker单元测试:如何测试Dockerfile(指南2020)
在开发新的Dockerfile时,为Docker编写单元测试应该成为日常工作的一部分。它可以为您节省大量时间来运行Docker映像来试图弄清为什么它不起作用,并且可以大大减少您对重建和更新容器的恐惧
在本指南中,您将学习:哪些工具可以帮助您测试Dockerfile,如何为Docker编写单元测试以及如何在持续集成管道中使其自动化。
Docker容器结构
我可以说服为Docker编写单元测试的最好工具是容器结构测试框架。
由Google开发的此框架使测试容器映像的结构变得非常容易。
如何安装
如果您使用的是Linux,请运行:
curl -LO https://storage.googleapis.com/container-structure-test/latest/container-structure-test-linux-amd64 && chmod +x container-structure-test-linux-amd64 && sudo mv container-structure-test-linux-amd64 /usr/local/bin/container-structure-test
测试选项
容器结构测试提供4种类型的测试:
- 命令测试:在图像中执行命令并检查输出
- 文件存在性测试:检查图像中是否存在文件
- 文件内容测试:检查文件的内容
- 元数据测试:检查容器元数据是否正确
如何编写Docker单元测试
所有你需要的是一个Dockerfile和.yaml
或.json
包含您的测试用例文件。
编写您的第一个Docker单元测试
对于此示例,我们将使用以下Dockerfile生成可在CI中使用的映像,以使用Bazel构建代码。
FROM ubuntu:bionic
RUN apt-get update \
&& apt-get install -y curl gnupg \
&& curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor > bazel.gpg \
&& mv bazel.gpg /etc/apt/trusted.gpg.d/ \
&& echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" > /etc/apt/sources.list.d/bazel.list \
&& apt-get update \
&& apt-get install -y bazel \
&& rm -rf /var/lib/apt/lists/*
RUN groupadd -g 1000 user \
&& useradd -d /home/user -m -u 1000 -g 1000 user \
&& chown -R user:user /home/user \
&& mkdir -p /bazel/cache \
&& chown -R user:user /bazel
RUN echo "build --repository_cache=/bazel/cache">/home/user/.bazelrc
并可以使用以下命令构建:
docker build -t docker-unit-test .
现在我们有一个Docker镜像,我们将其设置为root用户,但是在CI上,我们希望尽可能地模仿开发人员构建环境,为此,我们将以非root用户身份运行构建。
可能出什么问题了?
实际上有很多东西!
用户是否拥有构建配置文件?还是缓存文件夹?好了,您可以在将Docker映像部署到任何地方之前检查所有这些内容。
让我们unit-test.yaml
进行测试吧!
schemaVersion: '2.0.0'
fileExistenceTests:
- name: 'Check bazel cache folder'
path: '/bazel/cache'
shouldExist: true
uid: 1000
gid: 1000
isExecutableBy: 'group'
fileContentTests:
- name: 'Cache folder config'
path: '/home/user/.bazelrc'
expectedContents: ['.*build --repository_cache=/bazel/cache.*']
第一个测试Check bazel cache folder
将检查高速缓存文件夹是否存在并由非root用户拥有。第二项测试Cache folder config
将检查Bazel构建配置文件的内容是否符合预期。
一切就绪,我们可以通过以下方式运行测试:
$ container-structure-test test --image docker-unit-test --config unit-test.yaml
=======================================
====== Test file: unit-test.yaml ======
=======================================
=== RUN: File Content Test: cache folder config
--- PASS
duration: 0s
=== RUN: File Existence Test: Check bazel cache folder
--- PASS
duration: 0s
=======================================
=============== RESULTS ===============
=======================================
Passes: 2
Failures: 0
Duration: 0s
Total tests: 2
PASS
该框架对于在交付之前测试Docker映像非常有用,它快速且易于使用。
自动化Docker容器的测试
好了,现在我们已经准备好了Dockerfile和测试,是时候自动化测试过程了!
在此示例中,我假设您有一个Ansible管道,可在Continuos Integration中使用它来构建,标记和推送docker映像。我们将为该管道创建一个新任务以执行Docker单元测试。
- name: unit test Docker Image
shell: |
container-structure-test test --image {{ docker_image }} --config {{ test_file }}
if $?
then
echo "Test Failed"
exit 1
else
echo "Test Succeeded"
exit 0
fi
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » Docker单元测试:如何测试Dockerfile(指南2020)
常见问题FAQ
- 没有金币/金币不足 怎么办?
- 本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
- 所有资源普通会员都能下载吗?
- 本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。