Поиск по сайту
Ctrl + K
Вопросы по Docker

Как создать многослойную сборку в Docker?

Что такое многослойные сборки в Docker?

Многослойные сборки (multi-stage builds) в Docker — это возможность создавать образы, используя несколько этапов сборки в одном Dockerfile. Это позволяет разделять стадии сборки, что может значительно уменьшить размер итогового образа, улучшить безопасность и упрощает процесс разработки.

Зачем это нужно?

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

    Рассмотрим, как создать многослойную сборку для приложения на Node.js.

    Шаг 1: Подготовьте проект

    Создайте простое приложение на Node.js. Например, создайте файл app.js с простым кодом:

    const express = require('express');
    const app = express();
    const port = 3000;
    
    app.get('/', (req, res) => {
      res.send('Hello World!');
    });
    
    app.listen(port, () => {
      console.log(`App running at http://localhost:${port}`);
    });
    

    Также создайте файл package.json:

    {
      "name": "multi-stage-app",
      "version": "1.0.0",
      "main": "app.js",
      "dependencies": {
        "express": "^4.17.1"
      }
    }
    

    Шаг 2: Создайте Dockerfile

    Создайте Dockerfile и добавьте следующий код для многослойной сборки:

    # Первый этап: сборка приложения
    FROM node:14 AS build
    
    WORKDIR /usr/src/app
    
    COPY package*.json ./
    RUN npm install
    
    COPY . .
    
    # Второй этап: создание минимального образа
    FROM node:14-slim
    
    WORKDIR /usr/src/app
    
    COPY --from=build /usr/src/app .
    
    EXPOSE 3000
    CMD ["node", "app.js"]
    

    Объяснение:

  • Первый факультативный слой (build): Вы используете полный образ node:14 для установки всех зависимостей и компиляции приложения. Этот слой включает все необходимые инструменты для сборки, такие как компиляторы и пакеты.
  • Второй слой (runtime): Вы используете облегченный образ node:14-slim для создания конечного образа вашего приложения. Здесь мы копируем только необходимые файлы из первого слоя, избегая установки инструментов для сборки. Это значительно уменьшает размер итогового образа.
  • Шаг 3: Построение и запуск образа

    Теперь вы можете собрать и запустить свое приложение с помощью следующих команд:

    # Сборка образа
    docker build -t multi-stage-app .
    
    # Запуск контейнера
    docker run -p 3000:3000 multi-stage-app
    

    После выполнения этих команд ваше приложение будет доступно на http://localhost:3000.

    Заключение

    Многослойные сборки в Docker являются мощным инструментом, который помогает создавать оптимизированные образы. Используя различные стадии сборки, вы можете уменьшить итоговый размер образа и повысить его безопасность, исключая ненужные зависимости. Напоминаем, что важно поддерживать Dockerfile в распределенном состоянии и регулярно проверять обновленные базовые образы для повышения безопасности.