Использование многоступенчатой ​​сборки Docker для создания нескольких изображений - PullRequest
2 голосов
/ 18 июня 2019

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

Несколько 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?

...