223 lines
5.4 KiB
Markdown
223 lines
5.4 KiB
Markdown
# 🐳 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
|
||
```
|