Что и почему за многоэтатными строительствами
В DockerFile каждый оператор добавляет новый слой на изображение. Это может быть контрпродуктивным, если вы также создаете свой пакет приложений при создании изображения Docker. Это может значительно увеличить размер наших изображений Docker. Именно тогда нам нужно использовать функцию многоэтапных сборок.
Проще говоря, многоступенчатые сборки полезны, когда мы хотим очистить и уменьшить размер изображения, не сохраняя нежелательные артефакты, лежащие на нашем изображении.
Давайте поймем это через пример.
Конкретный пример
Я создал Образец React App и 2 Dockerfiles, чтобы продемонстрировать это, а именно, Девчонка Dockerfile
и Продлевать Dockerfile
Типичный DockerFile без этапов
Девчонка Dockerfile
FROM node:13.13.0-alpine WORKDIR /app COPY package.json ./ RUN npm install --silent RUN npm install react-scripts@3.4.1 -g --silent COPY . ./ CMD ["npm", "start"]
Давайте построим и запустим это изображение Docker:
docker build -t multi-stage-demo:dev -f Dev.Dockerfile .
В легкой версии мы используем одно и то же базовое изображение для создания приложения, но мы используем nginx
Базовое изображение для запуска нашего приложения, так как у нас уже есть приложение.
Продлевать Dockerfile
# Stage 1 - the build process FROM node:13.13.0-alpine as build-deps WORKDIR /app COPY package.json ./ RUN npm install --silent RUN npm install react-scripts@3.4.1 -g --silent COPY . ./ RUN npm run build # Stage 2 - the deploy process FROM nginx COPY --from=build-deps /app/build /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
Здесь вы заметите, что у нас есть два От
Директивы. Первый будет использоваться для базового изображения для построения приложения, а второй для окончательного изображения. Встроенные двоичные файлы копируются с первого изображения до второго, и мы выставляем порт 80 на хост.
Теперь давайте попробуем и построим это:
docker build -t multi-stage-demo:prod -f Prod.Dockerfile .
Время проверить наши размеры изображений
docker images | grep multi-stage-demo
Если мы сравним Dev
к Prod
Изображение, это ~ 73% снижение ! «Это также может принести вам пользу в сокращенное время развертывания.
Github Repo с кодом доступна здесь
Где отсюда?
Есть несколько хороших примеров и лучших практик, определенных в официальной документации Docker.
Например, если ваша сборка содержит несколько слоев, вы можете заказать их из менее часто изменяющихся (чтобы гарантировать, что кэш сборки может быть повторно используется) на более часто изменяется:
- Установите инструменты, необходимые для создания вашего приложения
- Установить или обновить библиотечные зависимости
- Создайте свое приложение
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
Рекомендации
- https://docs.docker.com/develop/develop-images/multistage-build/
- https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
Оригинал: «https://dev.to/sahan/multi-stage-image-builds-with-docker-38k6»