Как правильно организовать запуск контейнера для получения результата его работы во внешнее окружение?
Приступил к изучению Докера и возникли сомнения в понимании каких-то фундаментальных проблем, которые не позволяют двигаться дальше. Например: на основании образа из репозитория создал контейнер, в котором находится всего 1 тест на Cypress. Вот Dockerfile:
FROM cypress/base:14.17.0
COPY . .
RUN npm install --save-dev cypress
RUN $(npm bin)/cypress verify
RUN $(npm bin)/cypress run
команда FROM cypress/base использует образ cypress/base из репозитория Cypress, а COPY копирует все из каталога из-под которого я стартую Докер, в корень создаваемого контейнера (надеюсь, что я это правильно понимаю). Потом устанавливается фрейморк Cypress, проверяется его установка и наконец запускается Cypress в котором уже существует тот самый тест. И все вроде бы хорошо, запускаю командой
docker build -t cypress .
тест отрабатывает, в окне командной строки появляются его результаты (которые, правда, почему-то не сохраняюся в окне командной строки, а куда-то пропадают). Но возникает вопрос: как запустить тест повторно? Если опять использовать эту же команду, то в окне командной строки выводится только информация о работе Докера, а вот результаты теста больше не появляются. Команда docker container ls -a говорит, что контейнеров нет. В идеале, ситуация должна быть такой: у меня есть тестовый проект, куда я постоянно добавляю новые тесты, сегодня один, завтра 121 и т.д. хотелось бы иметь возможность указанным выше образом эти тесты запускать сколько угодно раз. Скажите, пожалуйста, как этого можно добиться?
Ответы (1 шт):
Докер работает таким образом, что сначала вы собираете образ (можно себе его представить как компиляцию исполняемого файла из исходных файлов), а потом запускаете контейнер (или несколько) используя этот образ (это как запуск процесса используя исполняемый файл).
При этом, если исходные файлы не менялись, то не смысла заново пересобирать образ - он получится таким же. Поэтому если повторно запустить docker build не внося изменений, то докер использует закешированные образы и по сути ничего не делает.
Вам нужно либо перенести запуск тестов на этап собственно запуска. Или запускать дополнительно уже после сборки (даже если тесты запускались как часть шага build).
Запускать тесты во время сборки имеет смысл, если они не пройдут, то значит где-то есть ошибка в программе - и образ создавать нет смысла. Если вы хотите заново запустить тесты, то используйте команду docker run:
docker run -ti cypress xxx
Вместо xxx укажите команду, которую нужно запустить внутри контейнера. Я не знаком в cypress потому дальше предположение, что, вероятно, вам нужна команда docker run -ti /bin/sh -c '$(npm bin)/cypress verify'