91 lines
3.2 KiB
Docker
91 lines
3.2 KiB
Docker
FROM node:lts-trixie-slim AS base
|
|
|
|
# Install dependencies only when needed
|
|
FROM base AS deps
|
|
WORKDIR /app
|
|
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
python3 make g++ \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Install dependencies based on the preferred package manager
|
|
COPY bookie/package.json bookie/yarn.lock* bookie/package-lock.json* bookie/pnpm-lock.yaml* ./
|
|
RUN \
|
|
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
|
|
elif [ -f package-lock.json ]; then npm ci; \
|
|
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \
|
|
else echo "Lockfile not found." && exit 1; \
|
|
fi
|
|
|
|
FROM base AS builder
|
|
WORKDIR /app
|
|
COPY --from=deps /app/node_modules ./node_modules
|
|
COPY /bookie ./
|
|
|
|
RUN \
|
|
if [ -f yarn.lock ]; then yarn run build; \
|
|
elif [ -f package-lock.json ]; then npm run build; \
|
|
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \
|
|
else echo "Lockfile not found." && exit 1; \
|
|
fi
|
|
|
|
FROM python:3.14-slim AS runner
|
|
LABEL maintainer="Amritanshu <docker@tanshu.com>"
|
|
|
|
RUN apt update \
|
|
&& apt install -y --no-install-recommends curl \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Install uv
|
|
# Ref: https://docs.astral.sh/uv/guides/integration/docker/#installing-uv
|
|
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
|
|
|
|
# Compile bytecode
|
|
# Ref: https://docs.astral.sh/uv/guides/integration/docker/#compiling-bytecode
|
|
ENV UV_COMPILE_BYTECODE=1
|
|
|
|
# Disable development dependencies
|
|
# Ref: https://docs.astral.sh/uv/guides/integration/docker/#installing-a-project
|
|
ENV UV_NO_DEV=1
|
|
|
|
# uv Cache
|
|
# Ref: https://docs.astral.sh/uv/guides/integration/docker/#caching
|
|
ENV UV_LINK_MODE=copy
|
|
WORKDIR /app/
|
|
|
|
# Place executables in the environment at the front of the path
|
|
# Ref: https://docs.astral.sh/uv/guides/integration/docker/#using-the-environment
|
|
ENV PATH="/app/.venv/bin:$PATH"
|
|
|
|
# Install dependencies
|
|
# Ref: https://docs.astral.sh/uv/guides/integration/docker/#intermediate-layers
|
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
--mount=type=bind,source=barker/uv.lock,target=uv.lock \
|
|
--mount=type=bind,source=barker/pyproject.toml,target=pyproject.toml \
|
|
uv sync --locked --no-install-project
|
|
|
|
COPY /barker ./
|
|
COPY --from=builder /frontend/browser /app/static
|
|
|
|
# Sync the project
|
|
# Ref: https://docs.astral.sh/uv/guides/integration/docker/#intermediate-layers
|
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
--mount=type=bind,source=barker/uv.lock,target=uv.lock \
|
|
--mount=type=bind,source=barker/pyproject.toml,target=pyproject.toml \
|
|
uv sync --locked
|
|
|
|
ENV PYTHONPATH=/app
|
|
EXPOSE 80
|
|
|
|
RUN chmod 777 /app/docker-entrypoint.sh \
|
|
&& ln -s /app/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh \
|
|
&& ln -s /app/docker-entrypoint.sh /
|
|
ENTRYPOINT ["docker-entrypoint.sh"]
|
|
|
|
# at the end of your Dockerfile, before CMD or after EXPOSE
|
|
# Kill the main process if the healthcheck fails. This will kill the container and restart policy can restart it.
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
|
|
CMD curl -fsS http://localhost/health || kill -s 15 1
|
|
|
|
CMD ["gunicorn", "barker.main:app", "--worker-class", "uvicorn.workers.UvicornWorker", "--config", "./gunicorn.conf.py", "--log-config", "./logging.conf"]
|