Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Конфигурация для Docker: полный обзор
В экосистеме Docker существует несколько типов конфигурационных файлов и подходов к управлению настройками контейнеров. Расскажу о каждом подробно.
Dockerfile
Это основной файл, описывающий образ Docker:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "main.py"]
Dockerfile содержит инструкции для сборки образа (слои, зависимости, точка входа).
docker-compose.yml
Это файл для оркестрации нескольких контейнеров:
version: "3.9"
services:
web:
build: .
ports:
- "8000:8000"
environment:
- DEBUG=True
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
- db
volumes:
- .:/app
db:
image: postgres:15
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
postgres_data:
docker-compose.yml (или docker-compose.yaml) — определяет сервисы, сети, тома и их взаимодействие.
.dockerignore
Аналогично .gitignore, исключает файлы из контекста сборки:
__pycache__
*.pyc
.git
.env
.gitignore
node_modules
.pytest_cache
.coverage
Environment файлы (.env)
Для переменных окружения:
# .env
DEBUG=False
DATABASE_URL=postgresql://user:pass@db:5432/mydb
REDIS_URL=redis://redis:6379
SECRET_KEY=your-secret-key-here
# Загрузка в Python
import os
from dotenv import load_dotenv
load_dotenv()
DATABASE_URL = os.getenv("DATABASE_URL")
DEBUG = os.getenv("DEBUG", "False") == "True"
.env.example
Темплат для переменных окружения (без секретов):
DEBUG=False
DATABASE_URL=postgresql://user:password@localhost:5432/dbname
REDIS_URL=redis://localhost:6379
SECRET_KEY=your-secret-key-here
API_KEY=your-api-key
docker.env
Переменные окружения, специфичные для Docker:
# docker.env
PYTHON_UNBUFFERED=1
PYTHONDONTWRITEBYTECODE=1
DEBUG=False
Загрузка в compose:
services:
web:
build: .
env_file:
- docker.env
- .env
Конфиг-файлы приложения
# config.py
import os
from dataclasses import dataclass
@dataclass
class Config:
DEBUG: bool = os.getenv("DEBUG", "False") == "True"
DATABASE_URL: str = os.getenv("DATABASE_URL", "sqlite:///db.sqlite3")
REDIS_URL: str = os.getenv("REDIS_URL", "redis://localhost:6379")
SECRET_KEY: str = os.getenv("SECRET_KEY", "change-me-in-production")
# Для разных сценариев
class Development:
DEBUG = True
DATABASE_URL = "sqlite:///dev.db"
class Production:
DEBUG = False
DATABASE_URL = os.getenv("DATABASE_URL")
class Testing:
DEBUG = True
DATABASE_URL = "sqlite:///:memory:"
TESTING = True
# Выбор конфига по переменной окружения
config_name = os.getenv("APP_ENV", "development")
if config_name == "production":
config = Config.Production()
elif config_name == "testing":
config = Config.Testing()
else:
config = Config.Development()
.dockerignore
Исключает ненужные файлы из контекста сборки (уменьшает размер):
# Версионирование
.git
.gitignore
.gitlab-ci.yml
.github
# IDE
.vscode
.idea
*.swp
*.swo
*~
# Python
__pycache__
*.pyc
*.pyo
*.egg-info
.pytest_cache
.coverage
venv/
*.egg
# OS
.DS_Store
.env
.env.local
# Документация
README.md
docs/
# Node
node_modules/
npm-debug.log
# Тесты
tests/
.pytest_cache/
Пример полной структуры проекта
project/
├── Dockerfile
├── docker-compose.yml
├── .dockerignore
├── .env.example
├── docker.env
├── requirements.txt
├── config.py
├── main.py
├── app/
│ ├── __init__.py
│ ├── api/
│ ├── models/
│ └── services/
└── tests/
Команды Docker
# Сборка образа
docker build -t myapp:1.0 .
# Запуск контейнера с переменными окружения
docker run --env-file .env -p 8000:8000 myapp:1.0
# Запуск с docker-compose
docker compose up -d
# Остановка
docker compose down
# Просмотр переменных в контейнере
docker exec <container_id> env
Лучшие практики
- Используй .env файлы для локальной разработки, но не коммитай их
- Храни секреты в переменных окружения, не в коде
- Минимизируй контекст сборки с .dockerignore
- Многоэтапные сборки для меньшего размера образа
- Версионирование образов (tags: latest, v1.0, v1.1)
В реальных проектах обычно используют комбинацию: Dockerfile для образа, docker-compose.yml для локальной разработки, .env для переменных и конфиг-классы в приложении для управления настройками.