From 5ada9867dfaca3321b04c440e656c30106971946 Mon Sep 17 00:00:00 2001 From: duhow Date: Wed, 25 Mar 2026 10:49:01 +0100 Subject: [PATCH 1/5] reorder install syntax and use docker cache --- Dockerfile | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3eab935..5e92ff0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,4 @@ +# syntax=docker/dockerfile:1 # Renfe Tracker – FastAPI app (Python 3.11, uv) with a React+Tailwind frontend build. FROM node:20-slim AS frontend-build @@ -9,20 +10,24 @@ RUN npm run build FROM python:3.11-slim -WORKDIR /app - # Install uv and gosu (entrypoint fixes volume permissions so app can create DB on first run) -RUN pip install --no-cache-dir uv \ - && apt-get update && apt-get install -y --no-install-recommends gosu \ - && rm -rf /var/lib/apt/lists/* +RUN --mount=type=cache,target=/root/.cache/pip/ \ + --mount=type=cache,target=/var/lib/apt/ \ + --mount=type=cache,target=/var/cache/apt/ \ + pip install uv \ + && apt-get update && apt-get install -y --no-install-recommends gosu + +WORKDIR /app # Install project and dependencies with uv (frozen lockfile) COPY pyproject.toml uv.lock README.md ./ +RUN --mount=type=cache,target=/root/.cache/uv/ \ + uv sync --frozen --no-dev + COPY app/ app/ COPY renfe_mcp/ renfe_mcp/ # Bundle i18n translation files so the backend can generate localised emails COPY frontend/src/i18n/ app/i18n/ -RUN uv sync --frozen --no-dev # Replace static assets with compiled React build COPY --from=frontend-build /frontend/dist/ app/static/ From 09529031238d701ebdea642ed0c41adfe4815139 Mon Sep 17 00:00:00 2001 From: duhow Date: Wed, 25 Mar 2026 10:52:06 +0100 Subject: [PATCH 2/5] add npm cache and chmod file directly --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5e92ff0..941c0ff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,8 @@ FROM node:20-slim AS frontend-build WORKDIR /frontend COPY frontend/package.json frontend/package-lock.json ./ -RUN npm ci +RUN --mount=type=cache,target=/root/.npm/ \ + npm ci COPY frontend/ ./ RUN npm run build @@ -35,8 +36,7 @@ COPY --from=frontend-build /frontend/dist/ app/static/ # Default run user is 1000:1000; override at runtime with PUID/PGID. No named user needed (entrypoint uses gosu with numeric id). RUN chown -R 1000:1000 /app -COPY entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh +COPY --chmod=0755 entrypoint.sh /entrypoint.sh ENV HOME=/app ENV DATA_DIR=/data From cf807de79e568cfe63615ef2f8a78dfdb61d6d41 Mon Sep 17 00:00:00 2001 From: duhow Date: Wed, 25 Mar 2026 10:52:18 +0100 Subject: [PATCH 3/5] add VOLUME to persisting path --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 941c0ff..36e0386 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,6 +40,7 @@ COPY --chmod=0755 entrypoint.sh /entrypoint.sh ENV HOME=/app ENV DATA_DIR=/data +VOLUME [ "/data" ] EXPOSE 8000 ENTRYPOINT ["/entrypoint.sh"] CMD ["uv", "run", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] From 212b3f12ec6b87dff460e7353b081e5a41cf1efa Mon Sep 17 00:00:00 2001 From: duhow Date: Wed, 25 Mar 2026 11:03:04 +0100 Subject: [PATCH 4/5] move entrypoint to base stage --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 36e0386..7577801 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,6 +18,7 @@ RUN --mount=type=cache,target=/root/.cache/pip/ \ pip install uv \ && apt-get update && apt-get install -y --no-install-recommends gosu +COPY --chmod=0755 entrypoint.sh /entrypoint.sh WORKDIR /app # Install project and dependencies with uv (frozen lockfile) @@ -36,7 +37,6 @@ COPY --from=frontend-build /frontend/dist/ app/static/ # Default run user is 1000:1000; override at runtime with PUID/PGID. No named user needed (entrypoint uses gosu with numeric id). RUN chown -R 1000:1000 /app -COPY --chmod=0755 entrypoint.sh /entrypoint.sh ENV HOME=/app ENV DATA_DIR=/data From 5939b25e7d57f47cbf406f03dbae20ea2557569d Mon Sep 17 00:00:00 2001 From: duhow Date: Wed, 25 Mar 2026 11:03:26 +0100 Subject: [PATCH 5/5] multi-stage with single chown - avoids duplicate layer --- Dockerfile | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7577801..c977708 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ RUN --mount=type=cache,target=/root/.npm/ \ COPY frontend/ ./ RUN npm run build -FROM python:3.11-slim +FROM python:3.11-slim AS base # Install uv and gosu (entrypoint fixes volume permissions so app can create DB on first run) RUN --mount=type=cache,target=/root/.cache/pip/ \ @@ -21,11 +21,15 @@ RUN --mount=type=cache,target=/root/.cache/pip/ \ COPY --chmod=0755 entrypoint.sh /entrypoint.sh WORKDIR /app +FROM base AS dependencies + # Install project and dependencies with uv (frozen lockfile) COPY pyproject.toml uv.lock README.md ./ RUN --mount=type=cache,target=/root/.cache/uv/ \ uv sync --frozen --no-dev +FROM base AS app + COPY app/ app/ COPY renfe_mcp/ renfe_mcp/ # Bundle i18n translation files so the backend can generate localised emails @@ -34,9 +38,11 @@ COPY frontend/src/i18n/ app/i18n/ # Replace static assets with compiled React build COPY --from=frontend-build /frontend/dist/ app/static/ -# Default run user is 1000:1000; override at runtime with PUID/PGID. No named user needed (entrypoint uses gosu with numeric id). -RUN chown -R 1000:1000 /app +FROM base AS final +# Default run user is 1000:1000; override at runtime with PUID/PGID. No named user needed (entrypoint uses gosu with numeric id). +COPY --chown=1000:1000 --from=dependencies /app /app +COPY --chown=1000:1000 --from=app /app /app ENV HOME=/app ENV DATA_DIR=/data