- PVSM.RU - https://www.pvsm.ru -

Как протестировать образ для docker за полсекунды

Как протестировать образ для docker за полсекунды - 1

В этой статье рассматривается простой способ создания и тестирования образов docker. По ходу повествования, используя Goss [1], мы напишем тесты, с помощью которых можно проверить официальный образ Nginx [2] всего за ~0,5 с.

В итоге у нас получится небольшой YAML-файл, описывающий желаемое состояние образа, с помощью которого мы сможем протестировать контейнер nginx:

docker run -p 8080:80 nginx

выполнив простую команду:

dgoss run -p 8080:80 nginx

Процедура займет около 500 миллисекунд и выдаст следующий результат:

INFO: Starting docker container
INFO: Container ID: 25d23a24
INFO: Running Tests
File: /var/log/nginx/error.log: exists: matches expectation: [true]
File: /var/log/nginx/error.log: linkedto: matches expectation: ["/dev/stderr"]
File: /var/log/nginx/error.log: filetype: matches expectation: ["symlink"]
File: /var/log/nginx/access.log: exists: matches expectation: [true]
File: /var/log/nginx/access.log: linkedto: matches expectation: ["/dev/stdout"]
File: /var/log/nginx/access.log: filetype: matches expectation: ["symlink"]
Process: nginx: running: matches expectation: [true]
Port: tcp:80: listening: matches expectation: [true]
Port: tcp:80: ip: matches expectation: [["0.0.0.0"]]
HTTP: http://localhost: status: matches expectation: [200]
HTTP: http://localhost: Body: matches expectation: [Welcome to nginx!]
Package: nginx: installed: matches expectation: [true]
Package: nginx: version: matches expectation: [["1.11.10-1~jessie"]]
Total Duration: 0.012s
Count: 13, Failed: 0, Skipped: 0
INFO: Deleting container

Замечание: если вам удобнее смотреть, нежели читать, в конце статьи вы можете найти ссылку на видеоверсию (на английском).

Необходимые инструменты

Чтобы иметь возможность выполнять приведенные в статье команды, вам понадобится Docker [3].

Установка инструментария для тестирования

В качестве инструмента для тестирования мы возьмем Goss [1]. Установка его проста и занимает несколько секунд.

curl -fsSL https://goss.rocks/install | sh

Замечание: если вам не нравится curl | sh, можно установить Goss вручную, воспользовавшись этими инструкциями [4].

Что же такое Goss [1]?

Goss — это использующий YAML инструмент для проверки конфигурации серверов, являющийся альтернативой serverspec [5]. Он упрощает написание тестов, которые могут быть сгенерированы на основе текущего состояния системы. Написанные тесты можно запустить на выполнение либо использовать в качестве желаемого конечного состояния системы.

Более подробную информацию см. на странице проекта [1].

Написание тестов

dgoss — это идущий в комплекте с Goss вспомогательный инструмент, который радикально упрощает написание тестов для docker. Предположим, что мы запустили контейнер следующим образом:

docker run -p 8080:80 nginx:1.11.10

Чтобы начать создание тестов, замените docker run на dgoss edit:

dgoss edit -p 8080:80 nginx:1.11.10

Эта команда запустит контейнер, установит Goss и откроет консоль контейнера:

INFO: Starting docker container
INFO: Container ID: 9468c0c3
INFO: Run goss add/autoadd to add resources

Теперь мы можем начать написание тестов. Вставьте в консоль следующие команды, которые сгенерируют тесты на основе текущего состояния системы:

goss a file /var/log/nginx/access.log /var/log/nginx/error.log
goss a process nginx
goss a port 80
goss a package nginx
goss a http http://localhost
exit

Замечание: “a” — это сокращенная форма от “add”.

После выполнения команды exit контейнер будет удален, а в текущей директории появится файл goss.yaml:

file:
  /var/log/nginx/access.log:
    exists: true
    mode: "0777"
    size: 11
    owner: root
    group: root
    linked-to: /dev/stdout
    filetype: symlink
    contains: []
  /var/log/nginx/error.log:
    exists: true
    mode: "0777"
    size: 11
    owner: root
    group: root
    linked-to: /dev/stderr
    filetype: symlink
    contains: []
package:
  nginx:
    installed: true
    versions:
    - 1.11.10-1~jessie
port:
  tcp:80:
    listening: true
    ip:
    - 0.0.0.0
process:
  nginx:
    running: true
http:
  http://localhost:
    status: 200
    allow-insecure: false
    no-follow-redirects: false
    timeout: 5000
    body: []

Эти тесты могут быть выполнены с помощью команды:

dgoss run nginx

Изменение тестов вручную

Сгенерированный ранее YAML-файл также может быть написан вручную. Команда dgoss edit создана для облегчения процесса написания тестов. Но в большинстве случаев сгенерированный YAML-файл все же приходится подправлять. Далее мы этим и займемся.

В секции файлов нам важно только то, чтобы журналы были связаны с stdout/stderr символьными ссылками. Поэтому давайте удалим проверки mode, size, owner, group и contains. Секция файлов должна выглядеть следующим образом:

file:
  /var/log/nginx/access.log:
    exists: true
    linked-to: /dev/stdout
    filetype: symlink
  /var/log/nginx/error.log:
    exists: true           
    linked-to: /dev/stderr
    filetype: symlink

Далее удалим флаги, связанные с https, и добавим проверку того, что в теле ответа есть строка «Welcome to nginx!»:

http:
  http://localhost:
    status: 200
    timeout: 5000
    body:
    - Welcome to nginx!

В нашем YAML-файле теперь должно быть 28 строк:

file:
  /var/log/nginx/access.log:
    exists: true
    linked-to: /dev/stdout
    filetype: symlink
  /var/log/nginx/error.log:
    exists: true
    linked-to: /dev/stderr
    filetype: symlink
package:
  nginx:
    installed: true
    versions:
    - 1.11.10-1~jessie
port:
  tcp:80:
    listening: true
    ip:
    - 0.0.0.0
process:
  nginx:
    running: true
http:
  http://localhost:
    status: 200
    timeout: 5000
    body:
    - Welcome to nginx!

Запустить эти тесты по-прежнему очень просто:

dgoss run nginx

Что дальше?

Эта статья предназначена для быстрого старта и демонстрирует простой тестовый сценарий. Более подробную информацию и продвинутые варианты использования можно найти на следующих страницах:

  • Goss [1] — используемый в этой статье инструмент.
  • dgoss [6] — утилита, которая находится в составе goss (также была рассмотрена в этой статье).
  • dgoss-examples [7] — репозиторий, в котором можно найти более сложные примеры использования dgoss для проверки образов докер.
  • Goss manual [8] — документация по Goss.


Ссылки:

  1. Оригинал: Tutorial: How to test your docker image in half a second [10].

Автор: Centos-admin.ru

Источник [11]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/testing/252367

Ссылки в тексте:

[1] Goss: https://github.com/aelsabbahy/goss

[2] Nginx: https://hub.docker.com/_/nginx/

[3] Docker: https://www.docker.com/

[4] этими инструкциями: https://github.com/aelsabbahy/goss#manual-installation

[5] serverspec: http://serverspec.org/

[6] dgoss: https://github.com/aelsabbahy/goss/tree/master/extras/dgoss

[7] dgoss-examples: https://github.com/aelsabbahy/dgoss-examples

[8] Goss manual: https://github.com/aelsabbahy/goss/blob/master/docs/manual.md

[9] Видеоверсия этой статьи: https://www.youtube.com/watch?v=PEHz5EnZ-FM

[10] Tutorial: How to test your docker image in half a second: https://medium.com/@aelsabbahy/tutorial-how-to-test-your-docker-image-in-half-a-second-bbd13e06a4a9

[11] Источник: https://habrahabr.ru/post/325570/