File size: 4,316 Bytes
aa983ad
c76cb5f
6abf74d
 
 
c76cb5f
 
 
 
14effdf
c76cb5f
e3fdb01
c76cb5f
 
6abf74d
c76cb5f
 
 
 
 
5ec3c7c
c76cb5f
 
 
 
 
aa983ad
7d6e00c
243f395
6abf74d
 
f2a79fa
fa76f5f
5ec3c7c
 
 
 
 
 
 
 
c76cb5f
6abf74d
 
c76cb5f
 
6abf74d
c76cb5f
424ca6b
14effdf
c76cb5f
e3fdb01
c76cb5f
 
6abf74d
c76cb5f
6abf74d
 
c76cb5f
aa983ad
 
5ec3c7c
 
 
 
6abf74d
50d657b
c76cb5f
6abf74d
 
 
aa983ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
424ca6b
aa983ad
424ca6b
aa983ad
 
 
 
d0e8490
 
e3fdb01
d0e8490
 
e3fdb01
d0e8490
424ca6b
 
 
 
aa983ad
 
 
 
 
 
e3fdb01
aa983ad
 
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
# 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.11-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-3+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:"

# Set working directory to function root directory
WORKDIR ${WORKDIR_ROOT}
COPY 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*
RUN apt update && apt install -y libgl1 curl python3-pip && apt clean
COPY ./dockerfiles/apt_preferences /etc/apt/preferences
COPY ./dockerfiles/debian.sources /etc/apt/sources.list.d/debian.sources
RUN apt update && apt install -t trixie zlib1g -y && apt clean
RUN echo "BUILDER: check libz.s* after install from trixie" && ls -l /usr/lib/${ARCH}-linux-gnu/libz.so*

RUN ls -l /etc/apt/sources* /etc/apt/preferences*

# 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-root --no-cache


FROM python:3.11-slim-bookworm AS runtime

ARG ARCH
ARG WORKDIR_ROOT

ENV VIRTUAL_ENV=${WORKDIR_ROOT}/.venv \
    PATH="${WORKDIR_ROOT}/.venv/bin:$PATH"

RUN echo "COPY --from=builder_global /usr/lib/${ARCH}-linux-gnu/libGL.so* /usr/lib/${ARCH}-linux-gnu/"
COPY --from=builder_global /usr/lib/${ARCH}-linux-gnu/libGL.so* /usr/lib/${ARCH}-linux-gnu/
RUN echo "RUNTIME: check libz.s* before upgrade" && ls -l /usr/lib/${ARCH}-linux-gnu/libz.so*
RUN echo "RUNTIME: remove libz.s* to force upgrade" && rm /usr/lib/${ARCH}-linux-gnu/libz.so*
COPY --from=builder_global /usr/lib/${ARCH}-linux-gnu/libz.so* /usr/lib/${ARCH}-linux-gnu/
RUN echo "RUNTIME: check libz.s* after copy" && ls -l /usr/lib/${ARCH}-linux-gnu/libz.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:20-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}

COPY ./sam-quantized/machine_learning_models ${WORKDIR_ROOT}/machine_learning_models
COPY --from=node_prod_deps /appnode/node_modules* ${FASTAPI_STATIC}/node_modules
COPY --from=node_build /appnode/dist* ${FASTAPI_STATIC}/dist
COPY static/list_files.html ${FASTAPI_STATIC}/
RUN ls -l ${FASTAPI_STATIC}/