1 # Wolne Lektury images.
3 # Stages marked with ##### are build targets:
4 # deps dev image (docker-compose.yml, code mounted)
5 # test docker-compose.test.yml
6 # prod production app image (default, last stage)
7 # nginx production nginx with static files
8 # postgres Postgres with Polish dictionary
9 # Stages marked with ===== are intermediate.
12 # Global build arguments. Stages using UID/GID must redeclare them
13 # (bare `ARG UID`) to bring them into scope; the defaults are set here.
15 ARG PYTHON_IMAGE=python:3.10-trixie
21 # deps #############################################################
23 # Base system and requirements.
24 # Used directly as the dev image, with code mounted.
26 FROM ${PYTHON_IMAGE} AS deps
31 RUN apt-get update && apt-get install -y \
34 texlive-xetex texlive-lang-polish \
40 texlive-fonts-extra-links \
41 fonts-noto-core fonts-noto-extra
44 COPY requirements/requirements.txt requirements.txt
46 RUN --mount=type=cache,target=/root/.cache/pip \
47 pip install -r requirements.txt
48 RUN --mount=type=cache,target=/root/.cache/pip \
51 django-debug-toolbar==3.2.2
53 RUN addgroup --gid $GID app && \
54 adduser --gid $GID --home /app --uid $UID app
58 RUN cp -a /usr/local/lib/python*/site-packages/librarian/fonts /usr/share/fonts
65 RUN mkdir /app/.ipython
69 # app #=============================================================
71 # Code and production requirements. Not production yet: needs
72 # staticfiles.json manifest from static-builder.
78 RUN --mount=type=cache,target=/root/.cache/pip \
87 # static-builder #==================================================
89 # Static files are collected here. Statics are then copied into
90 # the nginx image, and staticfiles.json manifest is copied back
91 # into the test and prod images.
93 FROM app AS static-builder
95 RUN python manage.py collectstatic --noinput
99 # nginx ############################################################
101 # Static files for production nginx. Config is mounted.
103 FROM nginx:alpine AS nginx
108 # COPY nginx.conf conf.d/...
110 RUN addgroup -g $GID app && addgroup nginx app
111 COPY --from=static-builder /app/var/static /app/var/static
115 # polish-dict #=====================================================
117 # Polish hunspell dictionary without diacritics, to allow
118 # full text search without diacritics.
120 FROM ${PYTHON_IMAGE} AS polish-dict
123 && apt-get install -y --no-install-recommends hunspell-pl \
124 && rm -rf /var/lib/apt/lists/*
126 COPY scripts/fold_hunspell.py /usr/local/bin/fold_hunspell.py
129 mkdir /out; cd /tmp; \
130 enc="$(sed -n 's/^SET[[:space:]]*//p' /usr/share/hunspell/pl_PL.aff | tr -d '\r')"; \
131 iconv -f "${enc:-UTF-8}" -t UTF-8 /usr/share/hunspell/pl_PL.dic > pl.dict; \
132 iconv -f "${enc:-UTF-8}" -t UTF-8 /usr/share/hunspell/pl_PL.aff > pl.affix; \
133 python3 /usr/local/bin/fold_hunspell.py pl.dict pl.affix \
134 /out/polish.dict /out/polish.affix; \
135 dpkg-query -W -f='hunspell-pl ${Version}\n' hunspell-pl > /out/polish.version
139 # postgres #########################################################
141 # Postgres with the dictionary from polish-dict.
143 FROM postgres:18 AS postgres
145 COPY --from=polish-dict /out/ /tmp/polish-dict/
146 RUN mv /tmp/polish-dict/* "/usr/share/postgresql/$PG_MAJOR/tsearch_data/" \
147 && rmdir /tmp/polish-dict
149 COPY scripts/postgres-polish.sql /docker-entrypoint-initdb.d/10-postgres-polish.sql
153 # test #############################################################
155 # Production image plus test requirements. Defined before `prod`,
156 # so that `prod` stays the default (last) stage.
161 COPY requirements/requirements-test.txt /tmp/
162 RUN --mount=type=cache,target=/root/.cache/pip \
163 pip install -r /tmp/requirements-test.txt
165 RUN mkdir -p /app/var/counters
166 COPY --from=static-builder /app/var/static/staticfiles.json /app/var/static/staticfiles.json
167 CMD ["./manage.py", "test"]
171 # prod #############################################################
173 # Production image: app + staticfiles.json manifest.
177 COPY --from=static-builder /app/var/static/staticfiles.json /app/var/static/staticfiles.json