Dockerfile для stage api копировал только main.py и schedule/, поэтому в контейнере 'from admin import ...' давал ModuleNotFoundError — api стартовал и сразу падал, compose останавливался на 'dependency failed to start'. Добавлен COPY admin.py и тест tests/test_deploy.py: проверяет, что в образ api попадают все модули backend, в frontend — страница админки и статика, а compose передаёт ADMIN_* и подключает том настроек.
48 lines
1.9 KiB
Python
48 lines
1.9 KiB
Python
"""Проверки сборки образов: все нужные файлы должны копироваться.
|
||
|
||
Ошибка «в Dockerfile забыли COPY admin.py» роняет контейнер на импорте, а
|
||
локальные тесты её не видят (они запускаются из исходников). Ловим статически.
|
||
"""
|
||
|
||
from pathlib import Path
|
||
|
||
ROOT = Path(__file__).resolve().parents[1]
|
||
DOCKERFILE = ROOT / "Dockerfile"
|
||
COMPOSE = ROOT / "docker-compose.yml"
|
||
|
||
|
||
def _stage(name: str) -> str:
|
||
dockerfile = DOCKERFILE.read_text(encoding="utf-8")
|
||
part = dockerfile.split(f"FROM base AS {name}", 1)[1]
|
||
for other in ("api", "frontend"):
|
||
if other != name:
|
||
part = part.split(f"FROM base AS {other}", 1)[0]
|
||
return part
|
||
|
||
|
||
def test_api_image_copies_every_backend_module():
|
||
stage = _stage("api")
|
||
for module in sorted((ROOT / "src" / "backend").glob("*.py")):
|
||
assert module.name in stage, f"{module.name} не копируется в образ api"
|
||
assert "src/backend/schedule" in stage, "пакет schedule не копируется в образ api"
|
||
|
||
|
||
def test_frontend_image_copies_page_and_static():
|
||
stage = _stage("frontend")
|
||
for path in ("src/frontend/main.py", "src/frontend/admin.html", "src/frontend/static"):
|
||
assert path in stage, f"{path} не копируется в образ frontend"
|
||
|
||
|
||
def test_compose_passes_admin_settings():
|
||
compose = COMPOSE.read_text(encoding="utf-8")
|
||
for var in (
|
||
"ADMIN_PATH",
|
||
"ADMIN_LOGIN",
|
||
"ADMIN_PASSWORD",
|
||
"SCHEDULE_INTERVAL_MINUTES",
|
||
"SETTINGS_FILE",
|
||
"SCHEDULE_API",
|
||
):
|
||
assert var in compose, f"{var} не передаётся контейнерам"
|
||
assert "schedule_data:/data" in compose, "том для настроек админки не подключён"
|