Переписана документация
This commit is contained in:
222
docs/dockerfile.md
Normal file
222
docs/dockerfile.md
Normal file
@@ -0,0 +1,222 @@
|
||||
# 🐳 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
|
||||
```
|
||||
Reference in New Issue
Block a user