File size: 5,721 Bytes
aa983ad c76cb5f 6abf74d c76cb5f 14effdf c76cb5f 679003c c76cb5f 6abf74d c76cb5f b48d711 c76cb5f aa983ad 7d6e00c b48d711 243f395 b48d711 6abf74d b48d711 f2a79fa fa76f5f b48d711 058f949 b48d711 c76cb5f 6abf74d c76cb5f 6abf74d c76cb5f 679003c 14effdf c76cb5f 679003c c76cb5f 6abf74d c76cb5f b48d711 c76cb5f b48d711 aa983ad 058f949 b48d711 6abf74d 50d657b c76cb5f 6abf74d aa983ad a5a3498 aa983ad 424ca6b aa983ad 424ca6b aa983ad d0e8490 e3fdb01 d0e8490 e3fdb01 d0e8490 424ca6b aa983ad b48d711 50d657b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
# Include global ARGs at the dockerfile top
ARG ARCH="x86_64"
ARG WORKDIR_ROOT="/var/task"
ARG FASTAPI_STATIC="${WORKDIR_ROOT}/static"
ARG PYTHONPATH="${WORKDIR_ROOT}:${PYTHONPATH}:/usr/local/lib/python3/dist-packages"
ARG POETRY_NO_INTERACTION=1
ARG POETRY_VIRTUALENVS_IN_PROJECT=1
ARG POETRY_VIRTUALENVS_CREATE=1
ARG POETRY_CACHE_DIR=/tmp/poetry_cache
FROM python:3.12-bookworm AS builder_global
ARG ARCH
ARG WORKDIR_ROOT
ARG PYTHONPATH
ARG POETRY_NO_INTERACTION
ARG POETRY_VIRTUALENVS_IN_PROJECT
ARG POETRY_VIRTUALENVS_CREATE
ARG POETRY_CACHE_DIR
ARG ZLIB1G="http://ftp.it.debian.org/debian/pool/main/z/zlib/zlib1g_1.3.dfsg+really1.3.1-1+b1_amd64.deb"
RUN echo "ARCH: $ARCH ..."
RUN echo "ARG POETRY_CACHE_DIR: ${POETRY_CACHE_DIR} ..."
RUN echo "ARG PYTHONPATH: $PYTHONPATH ..."
RUN echo "arg dep:"
RUN groupadd -g 999 python && useradd -r -u 999 -g python python
# Set working directory to function root directory
RUN mkdir ${WORKDIR_ROOT} && chown python:python ${WORKDIR_ROOT}
WORKDIR ${WORKDIR_ROOT}
COPY --chown=python:python requirements_poetry.txt pyproject.toml poetry.lock README.md ${WORKDIR_ROOT}/
# avoid segment-geospatial exception caused by missing libGL.so.1 library
RUN echo "BUILDER: check libz.s* before start:" && ls -l /usr/lib/${ARCH}-linux-gnu/libz.so* /lib/${ARCH}-linux-gnu/libz.so*
RUN apt update && apt install -y libgl1 curl python3-pip libexpat1 && apt clean
RUN curl -o /root/zlib1g-1.3.deb ${ZLIB1G}
RUN dpkg -i /root/zlib1g-1.3.deb
RUN rm /lib/x86_64-linux-gnu/libz.so.1.2* || echo "BUILDER: no /lib/${ARCH}-linux-gnu/libz.so.1.2* found"
RUN rm /usr/lib/${ARCH}-linux-gnu/libz.so.1.2* || echo "BUILDER: no /usr/lib/${ARCH}-linux-gnu/libz.so.1.2* found"
RUN ln -sf /usr/lib/${ARCH}-linux-gnu/libz.so.1 /usr/lib/${ARCH}-linux-gnu/libz.so
RUN ln -sf /lib/${ARCH}-linux-gnu/libz.so.1 /lib/${ARCH}-linux-gnu/libz.so
RUN echo "BUILDER: check libz.s* after install from trixie" && ls -l /usr/lib/${ARCH}-linux-gnu/libz.so* /lib/${ARCH}-linux-gnu/libz.so*
# poetry installation path is NOT within ${WORKDIR_ROOT}: not needed for runtime docker image
RUN python -m pip install -r ${WORKDIR_ROOT}/requirements_poetry.txt
RUN which poetry && poetry --version && poetry config --list
RUN poetry config virtualenvs.path ${WORKDIR_ROOT}
RUN echo "# poetry config --list #" && poetry config --list
RUN poetry install --no-cache
FROM python:3.12-slim-bookworm AS runtime
ARG ARCH
ARG WORKDIR_ROOT
ENV VIRTUAL_ENV=${WORKDIR_ROOT}/.venv PATH="${WORKDIR_ROOT}/.venv/bin:$PATH"
RUN groupadd -g 999 python && useradd -r -u 999 -g python python
RUN mkdir ${WORKDIR_ROOT} && chown python:python ${WORKDIR_ROOT}
RUN echo "RUNTIME: check libz.s* before start:" && ls -l /usr/lib/${ARCH}-linux-gnu/libz.so* /lib/${ARCH}-linux-gnu/libz.so*
COPY --from=builder_global /root/zlib1g-1.3.deb /root/zlib1g-1.3.deb
RUN dpkg -i /root/zlib1g-1.3.deb
RUN rm /lib/x86_64-linux-gnu/libz.so.1.2* || echo "RUNTIME: no /lib/${ARCH}-linux-gnu/libz.so.1.2* found"
RUN rm /usr/lib/${ARCH}-linux-gnu/libz.so.1.2* || echo "RUNTIME: no /usr/lib/${ARCH}-linux-gnu/libz.so.1.2* found"
RUN ln -sf /usr/lib/${ARCH}-linux-gnu/libz.so.1 /usr/lib/${ARCH}-linux-gnu/libz.so
RUN ln -sf /lib/${ARCH}-linux-gnu/libz.so.1 /lib/${ARCH}-linux-gnu/libz.so
RUN echo "RUNTIME: check libz.s* after install from trixie" && ls -l /usr/lib/${ARCH}-linux-gnu/libz.so* /lib/${ARCH}-linux-gnu/libz.so*
RUN echo "RUNTIME: check libexpat.so*, libGL.so* before start" && ls -l /usr/lib/${ARCH}-linux-gnu/libexpat.so* /usr/lib/${ARCH}-linux-gnu/libGL.so* || echo "libraries libexpat.so*, libGL.so* not found"
COPY --from=builder_global /usr/lib/${ARCH}-linux-gnu/libGL.so* /usr/lib/${ARCH}-linux-gnu/
COPY --from=builder_global /lib/${ARCH}-linux-gnu/libexpat.so* /lib/${ARCH}-linux-gnu/
RUN echo "RUNTIME: check libexpat.so*, libGL.so* after copy" && ls -l /usr/lib/${ARCH}-linux-gnu/libexpat.so* /usr/lib/${ARCH}-linux-gnu/libGL.so*
COPY --from=builder_global ${WORKDIR_ROOT}/.venv ${WORKDIR_ROOT}/.venv
RUN . ${WORKDIR_ROOT}/.venv && which python && pip list
RUN echo "new WORKDIR_ROOT after hidden venv copy => ${WORKDIR_ROOT}"
RUN ls -ld ${WORKDIR_ROOT}/
RUN ls -lA ${WORKDIR_ROOT}/
### conditional section
FROM node:22-slim AS node_fastapi
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable
COPY ./static /appnode
WORKDIR /appnode
FROM node_fastapi AS node_prod_deps
RUN --mount=type=cache,id=pnpm,target=/pnpm/store; pnpm install --prod --frozen-lockfile
# here multiple conditions concatenated to avoid failing on check
RUN if [ ! -d /appnode/node_modules ]; then echo "no node_modules folder" && exit 1; fi
FROM node_fastapi AS node_build
ARG VITE__MAP_DESCRIPTION
ARG VITE__SAMGIS_SPACE
ENV VITE__INDEX_URL="/"
RUN echo "VITE__MAP_DESCRIPTION:" ${VITE__MAP_DESCRIPTION}
RUN echo "VITE__SAMGIS_SPACE:" ${VITE__SAMGIS_SPACE}
RUN echo "VITE__INDEX_URL:" ${VITE__INDEX_URL}
RUN --mount=type=cache,id=pnpm,target=/pnpm/store; pnpm install --frozen-lockfile
RUN --mount=type=cache,id=pnpm,target=/pnpm/store; pnpm build
RUN --mount=type=cache,id=pnpm,target=/pnpm/store; pnpm tailwindcss -i /appnode/src/input.css -o /appnode/dist/output.css
RUN if [ ! -d /appnode/dist ]; then echo "no dist folder" && exit 1; fi
FROM runtime
ARG FASTAPI_STATIC
RUN mkdir ${FASTAPI_STATIC} && chown python:python ${FASTAPI_STATIC}
COPY --chown=python:python ./sam-quantized/machine_learning_models ${WORKDIR_ROOT}/machine_learning_models
COPY --chown=python:python --from=node_prod_deps /appnode/node_modules* ${FASTAPI_STATIC}/node_modules
COPY --chown=python:python --from=node_build /appnode/dist* ${FASTAPI_STATIC}/dist
COPY --chown=python:python static/list_files.html ${FASTAPI_STATIC}/
RUN ls -l ${FASTAPI_STATIC}/
|