# 🐳 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
```
