Выполните две команды, используя Dockerfile с ожиданием - PullRequest
0 голосов
/ 28 января 2020

У меня есть две команды для запуска в Dockerfile. Один для запуска тестов и создания журналов. Второй для генерации html отчета после выполнения тестов. Мой Dockerfile выглядит так:

FROM golang:1.13   
ADD . /app

WORKDIR /app

RUN go mod download

RUN go get -u "github.com/ains/go-test-html"

CMD ["make", "test", "$URL=", "$INTEGRATION=", "$TESTTYPE=", "$TAGS="]

CMD ["make", "html", "$HTML="]

А мой docker -compose.yml выглядит так:

version: '3'

services:
  tests:
    image: int-testing-framework:latest
    environment:
      - URL=http://localhost:3000/
      - INTEGRATION=kapten
      - TESTTYPE=contract
      - TAGS=quotes bookings getTrip cancelTrip

  html:
    image: int-testing-framework:latest
    command: make html
    environment:
      - HTML=html
    links:
      - tests
    depends_on:
      - tests  

А мои журналы выглядят так:

sudo docker-compose up
Creating network "integration_default" with the default driver
Starting integration_tests_1  ... done
Creating integration_html_1 ... done
Attaching to integration_tests_1, integration_html_1
html_1   | Generating HTML report
html_1   | go-test-html logs/[gotest_stdout_file] logs/[gotest_stderr_file] logs/output_file.html
html_1   | Test results written to '/app/logs/output_file.html'
integration_html_1 exited with code 0
tests_1  | Generating HTML report
tests_1  | go-test- logs/[gotest_stdout_file] logs/[gotest_stderr_file] logs/output_file.html
tests_1  | /bin/bash: go-test-: command not found
tests_1  | make: *** [Makefile:14: html] Error 127
integration_tests_1 exited with code 2

Служба tests: не выполняется полностью. Там должны быть журналы для испытаний. Любая идея о том, как сначала выполнить tests: и генерировать логи. И после этого генерировать html отчет?

1 Ответ

1 голос
/ 28 января 2020

Для этого вам нужен только один контейнер. Пусть его основная команда будет сценарием оболочки, который сначала запускает тесты, а затем генерирует отчет HTML.

#!/bin/sh
make test
RC=$?
make html
exit "$RC"
CMD ["./run_tests_and_report.sh"]

Вы также можете сделать что-то подобное, вызвав обе цели Makefile вместе

CMD ["make", "test", "html"]

(хотя это не сгенерирует отчет, если тесты сообщат ненулевой код завершения).

В вашем текущем подходе есть две проблемы. Во-первых, у контейнера Docker есть только одна точка входа и одна команда, поэтому, когда ваш пример Dockerfile имеет две строки CMD, вторая - это та, которая вступает в силу, и оба контейнера работают make html. Второе - это то, что Docker Compose почти не имеет опций синхронизации, и, в частности, нет способа заставить генерацию отчетов ожидать завершения выполнения теста до sh (если вы как-то не записали его в скрипт в своем контейнере) .

...