У меня есть проект с несколькими подпроектами, и я хочу отправить отдельный образ докера для каждого из них.Чтобы повысить эффективность, я хочу использовать многоступенчатые сборки и ищу шаблон наилучшей практики, как это сделать наиболее эффективным и интуитивно понятным способом.До сих пор я нашел две возможности, обе с недостатками:
Несколько Dockerfiles и сборочные вызовы
Я могу сделать один Dockerfile для образа компоновщика
FROM maven as builder
COPY . /build
WORKDIR /build
RUN mvn -e clean install
и отдельных Dockerfilesдля каждого подпроекта
FROM my_builder as builder
FROM openjdk:jre-slim as proj1
COPY --from=builder /build/proj1.jar /somewhere/
CMD ["java", "-jar","/somewhere/proj1.jar"]
Это работает, но недостатком является то, что мне приходится создавать свои изображения в несколько этапов, и Docker-файлы подпроектов не могут быть собраны сами по себе:
docker build -t my_builder .
docker build proj1/
docker build proj2/
Использование файла docker-compose
Я могу устранить эту проблему с помощью файла docker-compose:
version: "3.4"
services:
builder:
build:
context: ./
proj1:
build:
target: proj1
context: ./proj1
depends_on:
- builder
proj2:
build:
target: proj2
context: ./proj2
depends_on:
- builder
Преимущество заключается в возможности запуска сборки с однимкоманда
docker-compose build
, но имеет недостаток в создании ненужной и искусственной зависимости для docker-compose, которая не требуется в проекте.
Сборка всего проекта во всех подпроектах
Я мог бы также добавить этап сборки ко всем файлам Docker
FROM maven as builder
COPY . /build
WORKDIR /build
RUN mvn -e clean install
FROM openjdk:jre-slim as proj1
COPY --from=builder /build/proj1.jar /somewhere/
CMD ["java", "-jar","/somewhere/proj1.jar"]
Это имело бы преимущество в том, что я могу создать контейнер для каждого проекта отдельно
docker build proj1/
С другой стороны, он менее эффективен и нарушает принцип DRY (первая часть каждого Dockerile повторяется снова и снова).
Наилучшая практика?
Есть ли лучшеспособ сделать это?Желательно даже тот, который будет работать с одним Dockerfile?