Docker单元测试:如何测试Dockerfile(指南2020)

作者 : IT 大叔 本文共2676个字,预计阅读时间需要7分钟 发布时间: 2020-10-10

开发新的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

没有金币/金币不足 怎么办?
本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
所有资源普通会员都能下载吗?
本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

发表评论