diff --git a/backend/docker/Dockerfile b/backend/docker/Dockerfile index 345d41a1d1..69f7904cc8 100644 --- a/backend/docker/Dockerfile +++ b/backend/docker/Dockerfile @@ -1,17 +1,25 @@ FROM python:3.13.3-alpine AS builder -ENV OWASP_GID=1000 \ +ENV APK_CACHE_DIR="/home/owasp/.cache/apk" \ + APK_SYMLINK_DIR="/etc/apk/cache" \ + OWASP_GID=1000 \ OWASP_UID=1000 \ + PIP_CACHE_DIR="/home/owasp/.cache/pip" \ POETRY_CACHE_DIR="/home/owasp/.cache/pypoetry" \ POETRY_VIRTUALENVS_IN_PROJECT=true \ PYTHONUNBUFFERED=1 -RUN apk update && apk upgrade && \ +RUN mkdir -p ${APK_CACHE_DIR} ${POETRY_CACHE_DIR} && \ + ln -fns ${APK_CACHE_DIR} ${APK_SYMLINK_DIR} + +RUN --mount=type=cache,target=${APK_CACHE_DIR} \ + apk update && apk upgrade && \ addgroup -S -g ${OWASP_GID} owasp && \ adduser -S -h /home/owasp -u ${OWASP_UID} -G owasp owasp && \ - mkdir -p ${POETRY_CACHE_DIR} && \ - chown -R owasp:owasp /home/owasp && \ - python -m pip install poetry + chown -R owasp:owasp /home/owasp + +RUN --mount=type=cache,target=${PIP_CACHE_DIR} \ + python -m pip install poetry --cache-dir ${PIP_CACHE_DIR} WORKDIR /home/owasp @@ -34,7 +42,8 @@ RUN apk update && \ addgroup -S owasp && \ adduser -S -h /home/owasp -G owasp owasp -ENV PATH="/home/owasp/.venv/bin:$PATH" \ +ENV FORCE_COLOR=1 \ + PATH="/home/owasp/.venv/bin:$PATH" \ PYTHONUNBUFFERED=1 WORKDIR /home/owasp diff --git a/backend/docker/Dockerfile.local b/backend/docker/Dockerfile.local index 7afb1ca309..006e0996d1 100644 --- a/backend/docker/Dockerfile.local +++ b/backend/docker/Dockerfile.local @@ -2,18 +2,26 @@ FROM python:3.13.3-alpine AS builder SHELL ["/bin/sh", "-o", "pipefail", "-c"] -ENV OWASP_GID=1000 \ +ENV APK_CACHE_DIR="/home/owasp/.cache/apk" \ + APK_SYMLINK_DIR="/etc/apk/cache" \ + OWASP_GID=1000 \ OWASP_UID=1000 \ + PIP_CACHE_DIR="/home/owasp/.cache/pip" \ POETRY_CACHE_DIR="/home/owasp/.cache/pypoetry" \ POETRY_VIRTUALENVS_IN_PROJECT=true \ PYTHONUNBUFFERED=1 -RUN apk update && apk upgrade && \ +RUN mkdir -p ${APK_CACHE_DIR} ${POETRY_CACHE_DIR} && \ + ln -fns ${APK_CACHE_DIR} ${APK_SYMLINK_DIR} + +RUN --mount=type=cache,target=${APK_CACHE_DIR} \ + apk update && apk upgrade && \ addgroup -S -g ${OWASP_GID} owasp && \ adduser -S -h /home/owasp -u ${OWASP_UID} -G owasp owasp && \ - mkdir -p ${POETRY_CACHE_DIR} && \ - chown -R owasp:owasp /home/owasp && \ - python -m pip install poetry + chown -R owasp:owasp /home/owasp + +RUN --mount=type=cache,target=${PIP_CACHE_DIR} \ + python -m pip install poetry --cache-dir ${PIP_CACHE_DIR} USER owasp WORKDIR /home/owasp @@ -26,14 +34,24 @@ FROM python:3.13.3-alpine SHELL ["/bin/sh", "-o", "pipefail", "-c"] -RUN apk update && \ +ENV APK_CACHE_DIR="/home/owasp/.cache/apk" \ + APK_SYMLINK_DIR="/etc/apk/cache" \ + FORCE_COLOR=1 \ + PIP_CACHE_DIR="/home/owasp/.cache/pip" \ + PATH="/home/owasp/.venv/bin:$PATH" \ + PYTHONUNBUFFERED=1 + +RUN mkdir -p ${APK_CACHE_DIR} && \ + ln -fns ${APK_CACHE_DIR} ${APK_SYMLINK_DIR} + +RUN --mount=type=cache,target=${APK_CACHE_DIR} \ + apk update && apk upgrade && \ apk add postgresql-client redis && \ addgroup -S owasp && \ - adduser -S -h /home/owasp -G owasp owasp && \ - python -m pip install poetry + adduser -S -h /home/owasp -G owasp owasp -ENV PATH="/home/owasp/.venv/bin:$PATH" \ - PYTHONUNBUFFERED=1 +RUN --mount=type=cache,target=${PIP_CACHE_DIR} \ + python -m pip install poetry --cache-dir ${PIP_CACHE_DIR} EXPOSE 8000 diff --git a/backend/docker/Dockerfile.test b/backend/docker/Dockerfile.test index bf50b58086..39f9589d74 100644 --- a/backend/docker/Dockerfile.test +++ b/backend/docker/Dockerfile.test @@ -1,17 +1,25 @@ FROM python:3.13.3-alpine AS builder -ENV OWASP_GID=1000 \ +ENV APK_CACHE_DIR="/home/owasp/.cache/apk" \ + APK_SYMLINK_DIR="/etc/apk/cache" \ + OWASP_GID=1000 \ OWASP_UID=1000 \ + PIP_CACHE_DIR="/home/owasp/.cache/pip" \ POETRY_CACHE_DIR="/home/owasp/.cache/pypoetry" \ POETRY_VIRTUALENVS_IN_PROJECT=true \ PYTHONUNBUFFERED=1 -RUN apk update && apk upgrade && \ +RUN mkdir -p ${APK_CACHE_DIR} ${POETRY_CACHE_DIR} && \ + ln -fns ${APK_CACHE_DIR} ${APK_SYMLINK_DIR} + +RUN --mount=type=cache,target=${APK_CACHE_DIR} \ + apk update && apk upgrade && \ addgroup -S -g ${OWASP_GID} owasp && \ adduser -S -h /home/owasp -u ${OWASP_UID} -G owasp owasp && \ - mkdir -p ${POETRY_CACHE_DIR} && \ - chown -R owasp:owasp /home/owasp && \ - python -m pip install poetry + chown -R owasp:owasp /home/owasp + +RUN --mount=type=cache,target=${PIP_CACHE_DIR} \ + python -m pip install poetry --cache-dir ${PIP_CACHE_DIR} WORKDIR /home/owasp USER owasp diff --git a/cspell/Dockerfile b/cspell/Dockerfile index f856292006..1e0069ca51 100644 --- a/cspell/Dockerfile +++ b/cspell/Dockerfile @@ -4,12 +4,15 @@ WORKDIR /opt/node ENV PNPM_HOME="/pnpm" ENV NPM_CONFIG_RETRY=5 \ + NPM_CACHE="/nest/.npm" \ NPM_CONFIG_TIMEOUT=30000 \ PATH="$PNPM_HOME:$PATH" +RUN --mount=type=cache,target=${NPM_CACHE} \ + npm install --ignore-scripts -g pnpm --cache ${NPM_CACHE} + COPY package.json pnpm-lock.yaml ./ -RUN npm install --ignore-scripts -g pnpm RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ pnpm install --frozen-lockfile --ignore-scripts diff --git a/docs/docker/Dockerfile.local b/docs/docker/Dockerfile.local index a49da24b7a..7d0d24a6fc 100644 --- a/docs/docker/Dockerfile.local +++ b/docs/docker/Dockerfile.local @@ -2,18 +2,26 @@ FROM python:3.13.3-alpine AS builder SHELL ["/bin/sh", "-o", "pipefail", "-c"] -ENV OWASP_GID=1000 \ +ENV APK_CACHE_DIR="/home/owasp/.cache/apk" \ + APK_SYMLINK_DIR="/etc/apk/cache" \ + OWASP_GID=1000 \ OWASP_UID=1000 \ + PIP_CACHE_DIR="/home/owasp/.cache/pip" \ POETRY_CACHE_DIR="/home/owasp/.cache/pypoetry" \ POETRY_VIRTUALENVS_IN_PROJECT=true \ PYTHONUNBUFFERED=1 -RUN apk update && apk upgrade && \ +RUN mkdir -p ${APK_CACHE_DIR} ${POETRY_CACHE_DIR} && \ + ln -fns ${APK_CACHE_DIR} ${APK_SYMLINK_DIR} + +RUN --mount=type=cache,target=${APK_CACHE_DIR} \ + apk update && apk upgrade && \ addgroup -S -g ${OWASP_GID} owasp && \ adduser -S -h /home/owasp -u ${OWASP_UID} -G owasp owasp && \ - mkdir -p ${POETRY_CACHE_DIR} && \ - chown -R owasp:owasp /home/owasp && \ - python -m pip install poetry + chown -R owasp:owasp /home/owasp + +RUN --mount=type=cache,target=${PIP_CACHE_DIR} \ + python -m pip install poetry --cache-dir ${PIP_CACHE_DIR} WORKDIR /home/owasp USER owasp @@ -32,7 +40,8 @@ RUN addgroup -S owasp && \ mkdir -p /home/owasp && \ chown owasp:owasp /home/owasp -ENV PATH="/home/owasp/.venv/bin:$PATH" \ +ENV FORCE_COLOR=1 \ + PATH="/home/owasp/.venv/bin:$PATH" \ PYTHONUNBUFFERED=1 EXPOSE 8001 diff --git a/frontend/docker/Dockerfile b/frontend/docker/Dockerfile index 3b8946547e..d21f6d9c45 100644 --- a/frontend/docker/Dockerfile +++ b/frontend/docker/Dockerfile @@ -4,13 +4,25 @@ FROM node:22-alpine AS base FROM base AS builder # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine # to understand why libc6-compat might be needed. -ENV PNPM_HOME="/pnpm" +ENV APK_CACHE_DIR="/app/.cache/apk" \ + APK_SYMLINK_DIR="/etc/apk/cache" \ + FORCE_COLOR=1 \ + NPM_CACHE="/app/.npm" \ + PNPM_HOME="/pnpm" + ENV PATH="$PNPM_HOME:$PATH" -RUN apk add --no-cache libc6-compat +RUN mkdir -p ${APK_CACHE_DIR} && \ + ln -fns ${APK_CACHE_DIR} ${APK_SYMLINK_DIR} + +RUN --mount=type=cache,target=${APK_CACHE_DIR} \ + apk update && apk upgrade && apk add libc6-compat + WORKDIR /app -RUN npm install --ignore-scripts -g pnpm +RUN --mount=type=cache,target=${NPM_CACHE} \ + npm install --ignore-scripts -g pnpm --cache ${NPM_CACHE} + COPY --chmod=444 package.json pnpm-lock.yaml ./ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ pnpm install --frozen-lockfile --ignore-scripts diff --git a/frontend/docker/Dockerfile.e2e.test b/frontend/docker/Dockerfile.e2e.test index 14fdeee1df..1f65ebc64f 100644 --- a/frontend/docker/Dockerfile.e2e.test +++ b/frontend/docker/Dockerfile.e2e.test @@ -1,16 +1,19 @@ FROM mcr.microsoft.com/playwright:v1.52.0-jammy -ENV PNPM_HOME="/pnpm" ENV FORCE_COLOR=1 \ - NPM_CONFIG_RETRY=5 \ + NPM_CACHE="/app/.npm" \ + PNPM_HOME="/pnpm" + +ENV NPM_CONFIG_RETRY=5 \ NPM_CONFIG_TIMEOUT=30000 \ PATH="$PNPM_HOME:$PATH" +RUN --mount=type=cache,target=${NPM_CACHE} \ + npm install --ignore-scripts -g pnpm --cache ${NPM_CACHE} WORKDIR /app COPY --chmod=444 package.json pnpm-lock.yaml ./ -RUN npm install --ignore-scripts -g pnpm RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ pnpm install --frozen-lockfile --ignore-scripts diff --git a/frontend/docker/Dockerfile.local b/frontend/docker/Dockerfile.local index 989999f281..c7e9c59088 100644 --- a/frontend/docker/Dockerfile.local +++ b/frontend/docker/Dockerfile.local @@ -2,17 +2,27 @@ FROM node:22-alpine AS builder SHELL ["/bin/sh", "-o", "pipefail", "-c"] -RUN apk update && \ - apk add --no-cache git && \ - mkdir -p /home/owasp && \ - chown -R node:node /home/owasp && \ - npm install --ignore-scripts -g pnpm +ENV APK_CACHE_DIR="/home/owasp/.cache/apk" \ + APK_SYMLINK_DIR="/etc/apk/cache" \ + NPM_CACHE="/home/owasp/.npm" \ + PNPM_HOME="/pnpm" -ENV PNPM_HOME="/pnpm" ENV NPM_CONFIG_RETRY=5 \ NPM_CONFIG_TIMEOUT=30000 \ PATH="$PNPM_HOME:$PATH" +RUN mkdir -p ${APK_CACHE_DIR} && \ + ln -fns ${APK_CACHE_DIR} ${APK_SYMLINK_DIR} + +RUN --mount=type=cache,target=${APK_CACHE_DIR} \ + apk update && \ + apk add git && \ + mkdir -p /home/owasp && \ + chown -R node:node /home/owasp + +RUN --mount=type=cache,target=${NPM_CACHE} \ + npm install --ignore-scripts -g pnpm --cache ${NPM_CACHE} + WORKDIR /home/owasp COPY --chmod=444 --chown=node:node package.json pnpm-lock.yaml ./ @@ -23,11 +33,22 @@ FROM node:22-alpine SHELL ["/bin/sh", "-o", "pipefail", "-c"] -RUN apk update && \ +ENV APK_CACHE_DIR="/home/owasp/.cache/apk" \ + APK_SYMLINK_DIR="/etc/apk/cache" \ + FORCE_COLOR=1 \ + NPM_CACHE="/home/owasp/.npm" + +RUN mkdir -p ${APK_CACHE_DIR} && \ + ln -fns ${APK_CACHE_DIR} ${APK_SYMLINK_DIR} + +RUN --mount=type=cache,target=${APK_CACHE_DIR} \ + apk update && \ apk add --no-cache git && \ mkdir -p /home/owasp/.next && \ - chown -R node:node /home/owasp && \ - npm install --ignore-scripts -g pnpm + chown -R node:node /home/owasp + +RUN --mount=type=cache,target=${NPM_CACHE} \ + npm install --ignore-scripts -g pnpm --cache ${NPM_CACHE} COPY --from=builder --chmod=755 --chown=node:node /home/owasp/node_modules /home/owasp/node_modules diff --git a/frontend/docker/Dockerfile.unit.test b/frontend/docker/Dockerfile.unit.test index 74c7f8eaa2..23a7861d82 100644 --- a/frontend/docker/Dockerfile.unit.test +++ b/frontend/docker/Dockerfile.unit.test @@ -1,16 +1,19 @@ FROM node:22-alpine -ENV PNPM_HOME="/pnpm" ENV FORCE_COLOR=1 \ - NPM_CONFIG_RETRY=5 \ + NPM_CACHE="/app/.npm" \ + PNPM_HOME="/pnpm" + +ENV NPM_CONFIG_RETRY=5 \ NPM_CONFIG_TIMEOUT=30000 \ PATH="$PNPM_HOME:$PATH" +RUN --mount=type=cache,target=${NPM_CACHE} \ + npm install --ignore-scripts -g pnpm --cache ${NPM_CACHE} WORKDIR /app COPY --chmod=444 package.json pnpm-lock.yaml ./ -RUN npm install --ignore-scripts -g pnpm RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ pnpm install --frozen-lockfile --ignore-scripts && \ chown node:node /app diff --git a/schema/docker/Dockerfile.test b/schema/docker/Dockerfile.test index 95a1715734..b7c5885fdf 100644 --- a/schema/docker/Dockerfile.test +++ b/schema/docker/Dockerfile.test @@ -1,20 +1,35 @@ FROM python:3.13.3-alpine AS builder -RUN addgroup -S owasp && \ - adduser -S -h /home/owasp -G owasp owasp && \ - mkdir -p /home/owasp && \ - chown owasp:owasp /home/owasp && \ - python -m pip install --no-cache-dir poetry - -ENV FORCE_COLOR=1 \ +SHELL ["/bin/sh", "-o", "pipefail", "-c"] + +ENV APK_CACHE_DIR="/home/owasp/.cache/apk" \ + APK_SYMLINK_DIR="/etc/apk/cache" \ + OWASP_GID=1000 \ + OWASP_UID=1000 \ + PIP_CACHE_DIR="/home/owasp/.cache/pip" \ + POETRY_CACHE_DIR="/home/owasp/.cache/pypoetry" \ POETRY_VIRTUALENVS_IN_PROJECT=true \ PYTHONUNBUFFERED=1 +RUN mkdir -p ${APK_CACHE_DIR} && \ + ln -fns ${APK_CACHE_DIR} ${APK_SYMLINK_DIR} + +RUN --mount=type=cache,target=${APK_CACHE_DIR} \ + apk update && apk upgrade && \ + addgroup -S owasp -g ${OWASP_GID} && \ + adduser -S -h /home/owasp -u ${OWASP_UID} -G owasp owasp && \ + mkdir -p /home/owasp && \ + chown owasp:owasp /home/owasp + +RUN --mount=type=cache,target=${PIP_CACHE_DIR} \ + python -m pip install poetry --cache-dir ${PIP_CACHE_DIR} + WORKDIR /home/owasp USER owasp COPY --chmod=444 --chown=owasp:owasp poetry.lock pyproject.toml ./ -RUN poetry install --no-root +RUN --mount=type=cache,target=${POETRY_CACHE_DIR},uid=${OWASP_UID},gid=${OWASP_GID} \ + poetry install --no-root COPY *.json ./ COPY tests tests @@ -22,6 +37,8 @@ COPY utils utils FROM python:3.13.3-alpine +SHELL ["/bin/sh", "-o", "pipefail", "-c"] + RUN addgroup -S owasp && \ adduser -S -h /home/owasp -G owasp owasp && \ mkdir -p /home/owasp && \