diff --git a/.dockerignore b/.dockerignore index 03bf20c..3f8b525 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,73 +1,31 @@ -# Git -.git -.gitignore +# .dockerignore +.* +!.gitignore -# Python __pycache__ *.pyc *.pyo *.pyd -.Python -env -pip-log.txt -pip-delete-this-directory.txt -.tox -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover + *.log -.git -.mypy_cache -.pytest_cache -.hypothesis - -# Virtual environments -venv/ -env/ -ENV/ -env.bak/ -venv.bak/ - -# IDE -.vscode/ -.idea/ -*.swp -*.swo -*~ - -# OS -.DS_Store -.DS_Store? -._* -.Spotlight-V100 -.Trashes -ehthumbs.db -Thumbs.db - -# Project specific -.env -*.db -*.sqlite -*.sqlite3 logs/ -*.log -# Documentation +# Исключаем виртуальное окружение - оно НЕ нужно в образе! +venv/ +.venv/ + +# Исключаем файлы БД (создаются при запуске) +database/*.db +database/*.db-* + +# Служебные файлы +Dockerfile +docker-compose* README.md -*.md -docs/ +.env -# Examples -examples/ - -# Tests tests/ -test_*.py -*_test.py - -# Temporary files -*.tmp -*.temp +test/ +docs/ +.idea/ +.vscode/ \ No newline at end of file diff --git a/Dockerfile.optimized b/Dockerfile.optimized new file mode 100644 index 0000000..7a5c6ef --- /dev/null +++ b/Dockerfile.optimized @@ -0,0 +1,61 @@ +########################################### +# Этап 1: Сборщик (Builder) +########################################### +FROM python:3.9-slim as builder + +# Устанавливаем ВСЁ для сборки +RUN apt-get update && apt-get install -y \ + gcc \ + g++ \ + python3-dev \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app +COPY requirements.txt . + +# Устанавливаем зависимости в отдельную папку +RUN pip install --no-cache-dir --target /install -r requirements.txt + + +########################################### +# Этап 2: Финальный образ (Runtime) +########################################### +FROM python:3.9-alpine as runtime + +# Устанавливаем ТОЛЬКО НЕОБХОДИМЫЕ рантайм-зависимости +# curl НЕ НУЖЕН - используем встроенный Python для healthcheck +RUN apk add --no-cache \ + # Минимальные библиотеки для работы Python-пакетов + libstdc++ + +# Создаем пользователя (в Alpine Linux другие команды) +RUN addgroup -g 1001 app && \ + adduser -D -u 1001 -G app app + +WORKDIR /app + +# Копируем зависимости из сборщика +COPY --from=builder --chown=1001:1001 /install /usr/local/lib/python3.9/site-packages + +# Создаем директории для данных +RUN mkdir -p database logs && \ + chown -R 1001:1001 /app + +# Копируем исходный код +COPY --chown=1001:1001 . . + +USER 1001:1001 + +# Открываем порты +EXPOSE 8081 + +# Устанавливаем переменные окружения +ENV PYTHONPATH=/app +ENV PYTHONUNBUFFERED=1 + +# Healthcheck БЕЗ curl - используем встроенный Python +HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ + CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8081/health', timeout=5)" || exit 1 + +# Команда по умолчанию +CMD ["python", "main.py"] \ No newline at end of file