1. Введение
Docker — удобный инструмент для контейнеризации. Это настолько полезно, что иногда нам нужно иметь более одного Dockerfile в проекте. К сожалению, это противоречит прямому соглашению называть все файлы Dockerfile просто «Dockerfile».
В этом уроке мы рассмотрим обходной путь и поддержание чистой структуры проекта.
2. Докерфайл
Dockerfile — это файл, содержащий все инструкции, необходимые для сборки образа Docker. Docker может автоматически создавать образы, используя его, без необходимости каких-либо дополнительных команд или параметров. Из-за соглашения об именах нам даже не нужно (и до версии 1.8.0 мы фактически не могли) указывать путь к файлу.
Мы можем вызвать команду сборки
Docker из каталога, в котором находится Dockerfile:
$ docker build .
3. Указание имени Dockerfile
Начиная с версии 1.8.0, мы можем изменить имя Dockerfile и передать его команде сборки
с помощью параметра «-f»
. Допустим, у нас есть два файла Dockerfile, один для создания серверной части, а другой — для создания внешнего интерфейса.
Мы можем назвать их соответствующим образом и вызвать команду сборки
два раза, каждый раз передавая имя одного из Dockerfiles:
$ docker build -f Dockerfile.frontend .
...
$ docker build -f Dockerfile.backend .
Это решение будет работать нормально, но имеет некоторые неудобные недостатки . Во-первых, нам нужно вызывать команду сборки
отдельно для каждого файла. Это не страшно для двух файлов, но если бы у нас было больше компонентов, это могло бы быстро создать потребность в дополнительных сценариях сборки. Второй недостаток заключается в том, что некоторые IDE могут выйти из строя из-за отклонения от соглашения и перестать обеспечивать подсветку синтаксиса.
4. Использование docker-compose
Вместо того, чтобы менять имена Dockerfiles, мы можем поместить их в отдельные папки. Затем мы можем использовать docker-compose
для запуска сборки всех из них. Допустим, у нас есть структура каталогов, например:
docker-compose.yml
docker
├── frontend
│ └── Dockerfile
└── backend
└── Dockerfile
Хотя самое простое использование файла docker-compose
обычно означает использование изображений из репозитория, мы также можем указать пути к каталогам для сборки
:
version: '3'
services:
frontend:
build: ./docker/frontend
ports:
- "8081:8081"
backend:
build: ./docker/backend
ports:
- "8080:8080"
Теперь запуск docker-compose
будет создавать образы из Dockerfiles:
$ docker-compose up
Более того, в один файл docker-compose
мы можем поместить сервисы с разными способами создания образа. Некоторые могут быть собраны на лету из нашего исходного кода, другие могут быть предоставлены внешним реестром. Например, мы можем захотеть создать образ серверной части, но получить образ базы данных из общедоступного реестра:
services:
backend:
build: ./docker/backend
ports:
- "8080:8080"
postgres:
image: 'postgres:latest'
Теперь docker-compose
не только создаст наши сервисы и запустит их, но и предоставит нам базу данных.
5. Вывод
В этом руководстве мы изучили две разные стратегии работы с несколькими файлами Dockerfile в одном проекте.
Первый основан на изменении имен разных файлов Dockerfile и обеспечивает быстрое и элегантное решение проблемы. Второй опирается на docker-compose
и дает дополнительные возможности для структурирования и автоматизации процесса сборки.