Перевод статьи «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.
