Введение
Многоэтапная сборка Docker (Multi-stage Build) — это мощная функция, позволяющая использовать несколько инструкций FROM в одном Dockerfile. Каждый этап может использовать свой базовый образ, что позволяет отделить процесс компиляции и сборки приложения от финального образа, предназначенного для запуска. В этом челлендже вы на практике примените этот метод для создания оптимизированного Docker-образа.
Создание Dockerfile с многоэтапной сборкой
В этом разделе вам необходимо подготовить Dockerfile, реализующий концепцию многоэтапной сборки.
Задачи
- Создайте новый
Dockerfile, состоящий из двух этапов. На первом этапе должна происходить сборка приложения: установка необходимых зависимостей и запуск скрипта сборки. На втором этапе формируется финальный образ: в него копируется только скомпилированный код из первого этапа, устанавливаются зависимости, необходимые исключительно для работы (production), и открывается нужный порт.
Пример
Ниже описана последовательность действий, которую вам нужно выполнить:
Создайте новую директорию
myappи перейдите в нее.mkdir myapp cd myappЗагрузите исходный код NodeJS из репозитория
https://github.com/labex-labs/nodejs-example.git.git clone https://github.com/labex-labs/nodejs-example.gitПереместите загруженные файлы непосредственно в корень директории
myapp.mv nodejs-example/* . rm -rf nodejs-exampleСоздайте в директории
myappфайл с именемDockerfileсо следующим содержимым:## Stage 1: Build the application FROM node:14-alpine AS base WORKDIR /app COPY . ./ RUN npm install ## Stage 2: Create the final image FROM node:14-alpine WORKDIR /app COPY --from=base /app/ . EXPOSE 3000 CMD [ "npm", "start" ]
Требования
Для успешного прохождения этого этапа необходимо:
- Создать директорию
myappпо пути/home/labex/project. - Клонировать исходный код NodeJS в директорию
myapp. - Создать
Dockerfileв директорииmyappс указанным выше содержанием.
Сборка Docker-образа
На этом этапе вам предстоит собрать образ, используя подготовленный ранее Dockerfile.
Задачи
- Соберите новый образ с именем
myapp.
Пример
Вот как это должно выглядеть:
Используйте команду
docker buildдля создания образа с тегомmyapp.docker build -t myapp .Проверьте, что образ был успешно создан, с помощью команды
docker images.
Требования
Для выполнения этой задачи необходимо:
- Выполнить команду
docker buildвнутри директории/home/labex/project/myapp. - Присвоить образу имя
myapp.
Запуск Docker-контейнера
Теперь пришло время запустить контейнер на основе созданного образа.
Задачи
- Запустите контейнер из образа
myapp. Контейнер должен пробрасывать порт3000(внутри контейнера) на порт3030(на хост-машине). После запуска проверьте доступность приложения через браузер.
Пример
Пример выполнения задачи:
Запустите новый контейнер с именем
my-app.docker run --name my-app -p 3030:3000 myappОткройте веб-браузер и перейдите по адресу
http://localhost:3030, чтобы увидеть работающее приложение.
Требования
Для завершения челленджа необходимо:
- Запустить контейнер с именем
my-app. - Настроить маппинг портов: порт
3000контейнера на порт3030хоста.
Резюме
Поздравляем! В этом испытании вы научились использовать многоэтапную сборку Docker для создания компактных и эффективных образов. Разделяя среду сборки и среду выполнения в одном Dockerfile, вы можете значительно уменьшить размер итогового образа и повысить безопасность приложения. Теперь вы готовы применять технологию Multi-stage Build в своих собственных проектах.



