Я создаю несколько интеграционных тестов для моих образов докера, используя docker-compose
. docker-compose
имеет аккуратный флаг --exit-code-from
, позволяющий останавливать все докеры и возвращать код завершения из тестового докера после завершения тестов.
Однако проблема в том, что --exit-code-from
автоматически включает флаг --abort-on-container-exit
. Это вполне логично, но создает следующую проблему:
Нормальный случай
- запускается тестируемая система
- интеграционные тесты запускают тесты и завершают работу с кодом ошибки X
- все контейнеры остановлены
- возвращается код выхода X.
проблемный случай
- запускается тестируемая система
- до завершения интеграционных тестов тестируемая система завершает работу с ошибкой
- все контейнеры остановлены
- код выхода 0 возвращается! Как будто испытания пройдены успешно.
Вы можете воспроизвести это со следующими файлами:
Dockerfile
FROM alpine as development
ENTRYPOINT [ "/bin/false" ]
FROM alpine as test
ENTRYPOINT [ "/bin/sleep", "3" ]
докер-compose.yml
version: "3.5"
services:
sut:
build:
context: .
target: development
test:
build:
context: .
target: test
и затем работает
docker-compose up --build --exit-code-from test
echo $? # print exit code from previous command
, который вернет код выхода 0.
Я хотел бы, чтобы код выхода 0 означал: интеграционные тесты действительно выполнялись и были успешными.
EDIT:
после просмотра этой проблемы https://github.com/docker/compose/pull/6077/commits объединены в docker-compose
1.22.0; Я снова побежал с последней версией docker-compose
(на данный момент 1.24.1), но все еще сталкиваюсь с проблемой.