5.4 KiB
5.4 KiB
🐳 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