Как указать разные файлы .dockerignore для разных сборок в одном проекте?

Я использовал список tests в .dockerignore, чтобы он не включался в изображение, которое я использовал для запуска веб-службы.

Теперь я пытаюсь использовать Docker для запуска моих модульных тестов, и в этом случае я хочу включить каталог tests.

Я проверил docker build -h и не нашел никакой опции.

Как я могу это сделать?

Ответ 1

Докер 19.03 поставил решение для этого.

Клиент Docker сначала пытается загрузить <dockerfile-name>.dockerignore, а затем возвращается к .dockerignore, если его не удается найти. Поэтому docker build -f Dockerfile.foo . сначала пытается загрузить Dockerfile.foo.dockerignore.

Установка переменной среды DOCKER_BUILDKIT=1 в настоящее время требуется для использования этой функции.

Смотрите также:

Ответ 2

На данный момент нет никакого способа сделать это. Существует длинная дискуссия о добавлении флага --ignore к Docker для обеспечения использования файла игнорирования - см. здесь.

Параметры, которые у вас есть на данный момент, в основном уродливы:

  • Разделите проект на подкаталоги, каждый из которых имеет свои собственные Dockerfile и .dockerignore, которые могут не работать в вашем случае.
  • Создайте script, который копирует соответствующие файлы во временный каталог и запускает там сборку Docker.

Ответ 3

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

services:
   tests:
      image: my-clean-image
      volumes:
         - '../app:/opt/app' # Add removed tests

Ответ 4

Другим вариантом является следующий процесс сборки, включающий тесты. Как я это делаю:

Если тесты являются модульными тестами, я создаю новое изображение Docker, которое получается из основного изображения проекта; Я просто вставляю FROM вверху, а затем ADD тесты, а также любые необходимые инструменты (в моем случае mocha, chai и т.д.). Это новое "тестовое" изображение теперь содержит как тесты, так и исходный источник для тестирования. Затем он может быть просто запущен как есть или может быть запущен в режиме просмотра с томами, сопоставленными с вашими источниками и тестовыми каталогами на хосте.

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