Рубрики
Uncategorized

Многоценное изображение сборки с Docker

Что и почему за многоэтатными строительствами В DockerFile каждый утверждение добавляет новый слой … Tagged с Docker, DevOps, Tulciory, Containers.

Что и почему за многоэтатными строительствами

В 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/

Рекомендации

  1. https://docs.docker.com/develop/develop-images/multistage-build/
  2. https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

Оригинал: «https://dev.to/sahan/multi-stage-image-builds-with-docker-38k6»