Docker юнит-тест: как протестировать Docker-файл (Руководство 2020)

Перевод статьи «Docker unit test: how to test a Dockerfile (Guide 2020)».

Вы знаете, что нужно тестировать все

Не так ли?

Написание юнит-тестов должно стать частью вашей ежедневной рутины при разработке нового Dockerfile. Это сэкономит вам кучу времени, которое обычно тратится на запуск образа Docker и на попытку выяснить, почему он не работает. Плюс это значительно уменьшит ваш страх перед пересборкой и обновлением контейнера (если вы все еще не доверяете моему тестированию, прочитайте эту статью от Джеймса Шора).

В этом руководстве вы узнаете: какие инструменты помогут вам протестировать ваш Dockerfile, как написать юнит-тест для Docker и как автоматизировать его в CI.

Больше информации о Docker в нашем КАНАЛЕ "DOCKER ПРОСТЫМИ СЛОВАМИ"

Структура Docker контейнера

Лучший инструмент для написания юнит-тестов для Docker — это Container Structure Test фреймворк. Этот фреймворк, разработанный компанией 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 файл, содержащий ваши тесты.

Напишите свой первый юнит-тест

В этом примере мы будем использовать следующий 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 образ, который будет корневым, но в CI мы хотим иметь среду максимально близкую к среде разработки. Для этого мы запустим сборку от имени обычного пользователя, у которого нет .

Что может пойти не так?

На самом деле много чего!

Является ли пользователь владельцем файлов конфигурации сборки? Или папка кэша? Все это можно проверить перед развертыванием образа 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 проверит, что папка cache существует и принадлежит не 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 пайплайн, который вы используете в CI для сборки, простановка тегов и пуша образа. Мы создадим новую задачу для этого пайплайн, чтобы выполнить юнит-тест.

- 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

Бинго!

Свяжитесь со мной в Twitter @gasparevitta и дайте мне знать ваши мысли!.

Надеюсь, это будет вам полезно и с этого момента вы начнете тестировать свои Dockerfile.

Вы можете найти фрагменты кода на Github.

🔥 Какой была ваша первая зарплата в QA и как вы искали первую работу? 

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

Читать в телеграм

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *