Files
Dockerfile/docs/dockerfile.md
2025-10-29 14:47:35 +03:00

5.4 KiB
Raw Permalink Blame History

🐳 Dockerfile

Особенности

  • Базовый образ: Ubuntu 22.04 (настраивается через ARG)
  • Предустановленные утилиты: curl, wget, nano, mc, net-tools, ping и др.
  • Оптимизированный размер: удаление кэша apt после установки
  • Безопасность: возможность создания непривилегированного пользователя
  • Гибкость: легко расширяется под конкретные нужды

Использование

# Сборка с базовым образом Ubuntu 22.04
make docker build IMAGE=myapp TAG=latest

# Сборка с другим базовым образом
make docker build IMAGE=myapp TAG=latest BUILD_ARGS="--build-arg BASE_IMAGE=ubuntu:20.04"

# Сборка без кэша
make docker build IMAGE=myapp TAG=latest NO_CACHE=1

Структура Dockerfile

# Базовый образ (настраивается)
ARG BASE_IMAGE=ubuntu:22.04
FROM ${BASE_IMAGE}

# Метаданные
LABEL maintainer="Sergey Antropov <devops@devops.org.ru>"

# Настройки окружения
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/UTC
ENV LANG=C.UTF-8

# Установка утилит
RUN apt-get update && apt-get install -y \
    ca-certificates curl wget bash tzdata \
    nano mc tar gzip unzip net-tools \
    iputils-ping && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Рабочая директория
WORKDIR /app

Расширение Dockerfile

Добавление пользователя

# Создание непривилегированного пользователя
RUN useradd -ms /bin/bash appuser && \
    chown -R appuser:appuser /app
USER appuser

Добавление портов

# Открытие портов
EXPOSE 8080
EXPOSE 3000

Добавление переменных окружения

# Переменные для приложения
ENV APP_HOME=/app
ENV PATH="$PATH:/app/bin"
ENV NODE_ENV=production

Добавление команды по умолчанию

# Команда по умолчанию
CMD ["bash"]
# или
CMD ["npm", "start"]

Примеры использования

Базовое использование

# Простая сборка
make docker build IMAGE=myapp TAG=latest

# Сборка с проверкой
make docker build IMAGE=myapp TAG=v1.0.0
make docker check RUN_CMD="lsb_release -a"

Сборка с аргументами

# Передача переменных в Dockerfile
make docker build \
  IMAGE=myapp \
  TAG=v1.0.0 \
  BUILD_ARGS="--build-arg VERSION=1.0.0 --build-arg NODE_ENV=production"

Сборка с файлом аргументов

# Создание файла build.args
cat > build.args << EOF
VERSION=1.0.0
BUILD_DATE=2024-01-15
NODE_ENV=production
EOF

# Сборка с файлом аргументов
make docker build IMAGE=myapp TAG=v1.0.0 ARG_FILE=build.args

Оптимизация Dockerfile

Многоэтапная сборка

# Build stage
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

# Production stage
FROM node:18-alpine AS production
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
CMD ["npm", "start"]

Использование .dockerignore

# .dockerignore
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage

Минимизация слоев

# Плохо - много слоев
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y wget
RUN apt-get clean

# Хорошо - один слой
RUN apt-get update && \
    apt-get install -y curl wget && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

Безопасность

Использование непривилегированного пользователя

# Создание пользователя
RUN useradd -ms /bin/bash appuser
USER appuser

Сканирование уязвимостей

# Проверка уязвимостей
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
  aquasec/trivy image myapp:latest

# Проверка с детальным отчетом
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
  aquasec/trivy image --severity HIGH,CRITICAL myapp:latest

Обновление пакетов

# Обновление всех пакетов
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

Отладка

Просмотр истории сборки

# История слоев
docker history myapp:latest

# Детальная информация
docker image inspect myapp:latest

Интерактивная отладка

# Запуск интерактивного контейнера
docker run -it --rm myapp:latest /bin/bash

# Запуск с отладкой
docker run -it --rm \
  -p 8080:8080 \
  -e DEBUG=1 \
  myapp:latest

Анализ размера образа

# Анализ слоев
docker run --rm -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  wagoodman/dive:latest myapp:latest