Перейти к основному содержимому

Несколько файлов Docker в одном проекте

· 3 мин. чтения

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 и дает дополнительные возможности для структурирования и автоматизации процесса сборки.