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

223 lines
5.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🐳 Dockerfile
## Особенности
- **Базовый образ:** Ubuntu 22.04 (настраивается через ARG)
- **Предустановленные утилиты:** curl, wget, nano, mc, net-tools, ping и др.
- **Оптимизированный размер:** удаление кэша apt после установки
- **Безопасность:** возможность создания непривилегированного пользователя
- **Гибкость:** легко расширяется под конкретные нужды
## Использование
```bash
# Сборка с базовым образом 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
```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
### Добавление пользователя
```dockerfile
# Создание непривилегированного пользователя
RUN useradd -ms /bin/bash appuser && \
chown -R appuser:appuser /app
USER appuser
```
### Добавление портов
```dockerfile
# Открытие портов
EXPOSE 8080
EXPOSE 3000
```
### Добавление переменных окружения
```dockerfile
# Переменные для приложения
ENV APP_HOME=/app
ENV PATH="$PATH:/app/bin"
ENV NODE_ENV=production
```
### Добавление команды по умолчанию
```dockerfile
# Команда по умолчанию
CMD ["bash"]
# или
CMD ["npm", "start"]
```
## Примеры использования
### Базовое использование
```bash
# Простая сборка
make docker build IMAGE=myapp TAG=latest
# Сборка с проверкой
make docker build IMAGE=myapp TAG=v1.0.0
make docker check RUN_CMD="lsb_release -a"
```
### Сборка с аргументами
```bash
# Передача переменных в Dockerfile
make docker build \
IMAGE=myapp \
TAG=v1.0.0 \
BUILD_ARGS="--build-arg VERSION=1.0.0 --build-arg NODE_ENV=production"
```
### Сборка с файлом аргументов
```bash
# Создание файла 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
### Многоэтапная сборка
```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
```dockerfile
# .dockerignore
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
```
### Минимизация слоев
```dockerfile
# Плохо - много слоев
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/*
```
## Безопасность
### Использование непривилегированного пользователя
```dockerfile
# Создание пользователя
RUN useradd -ms /bin/bash appuser
USER appuser
```
### Сканирование уязвимостей
```bash
# Проверка уязвимостей
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
```
### Обновление пакетов
```dockerfile
# Обновление всех пакетов
RUN apt-get update && \
apt-get upgrade -y && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
```
## Отладка
### Просмотр истории сборки
```bash
# История слоев
docker history myapp:latest
# Детальная информация
docker image inspect myapp:latest
```
### Интерактивная отладка
```bash
# Запуск интерактивного контейнера
docker run -it --rm myapp:latest /bin/bash
# Запуск с отладкой
docker run -it --rm \
-p 8080:8080 \
-e DEBUG=1 \
myapp:latest
```
### Анализ размера образа
```bash
# Анализ слоев
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
wagoodman/dive:latest myapp:latest
```