File size: 5,995 Bytes
9954ac1
d95b5e7
a5a70f7
 
 
d95b5e7
 
 
 
233631f
14effdf
d95b5e7
0139375
d95b5e7
 
a5a70f7
d95b5e7
 
 
 
 
cef51c1
d95b5e7
 
 
 
 
9954ac1
7d6e00c
cef51c1
243f395
cef51c1
a5a70f7
cef51c1
f2a79fa
fa76f5f
cef51c1
e8f851a
cef51c1
 
 
 
 
 
 
d95b5e7
a5a70f7
 
d95b5e7
 
a5a70f7
d95b5e7
0139375
14effdf
d95b5e7
0139375
d95b5e7
 
a5a70f7
233631f
d95b5e7
cef51c1
 
233631f
 
cef51c1
233631f
 
 
 
 
cef51c1
d95b5e7
cef51c1
 
 
 
 
 
 
 
 
 
9954ac1
e8f851a
cef51c1
a5a70f7
3f763b7
d95b5e7
a5a70f7
 
 
9954ac1
 
 
6507a0a
9954ac1
 
 
 
 
 
 
 
 
 
 
7eaf013
9954ac1
7eaf013
9954ac1
 
 
 
fea8a6e
 
e0b709e
fea8a6e
 
e0b709e
fea8a6e
7eaf013
 
45f1577
7eaf013
9954ac1
 
 
 
 
cef51c1
 
 
 
 
 
3f763b7
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
130
131
132
133
134
135
136
137
138
# 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
ARG HOME_USER=/home/python


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
ARG HOME_USER

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

# workaround for missing /home folder
RUN mkdir -p /home
RUN groupadd -g 999 python && useradd -r -u 999 -g python python
RUN ls -l /home
RUN ls -ld /home
RUN mkdir -p ${HOME_USER} ${HOME_USER}/.config && chown python:python -R ${HOME_USER}
RUN ls -ld ${HOME_USER}
RUN ls -lA ${HOME_USER}
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 dlx @tailwindcss/cli -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}/