Вопросы по Docker

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

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

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

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

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

Пример многослойной сборки

Рассмотрим, как создать многослойную сборку для приложения на 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"]

Объяснение:

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

Шаг 3: Построение и запуск образа

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

# Сборка образа
docker build -t multi-stage-app .

# Запуск контейнера
docker run -p 3000:3000 multi-stage-app

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

Заключение

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