binárka / linux (pull_request) Successful in 11s
image / image (pull_request) Successful in 7s
testy / pytest (3.11) (pull_request) Successful in 1s
testy / pytest (3.12) (pull_request) Successful in 1s
testy / pytest (3.13) (pull_request) Successful in 1s
testy / pytest (3.14) (pull_request) Successful in 1s
Balíček se po publikaci objevil jen pod uživatelem, záložka Packages u repozitáře zůstala prázdná. Gitea páruje kontejnerový balíček s repozitářem podle labelu org.opencontainers.image.source a image dosud neměl labely vůbec žádné. Kromě source ještě title, description, url a version — ta se plní z build argumentu, takže sedí s tím, co hlásí --version.
57 lines
2.3 KiB
Docker
57 lines
2.3 KiB
Docker
# Počitadlo kostek jako kontejner.
|
|
#
|
|
# Staví se ze zdrojáků, ne z vydané binárky: image jde pak sestavit pro
|
|
# amd64 i arm64 a nezávisí na tom, jestli pro danou architekturu release
|
|
# proběhl. Závislosti jsou zamčené v requirements.txt, takže je sestavení
|
|
# opakovatelné.
|
|
#
|
|
# docker build -f deploy/Dockerfile -t gitea.spacilovi.eu/david-spacil/dice-counter:latest .
|
|
#
|
|
# Sestavuje se z kořene repozitáře, ne z deploy/.
|
|
FROM python:3.11-slim
|
|
|
|
# Verze se jinak nemá kde vzít — v image není git ani zabalená binárka.
|
|
ARG VERSION=neznámá
|
|
|
|
# Podle image.source si Gitea připne balíček k repozitáři. Bez toho labelu
|
|
# image sice existuje, ale visí jen pod uživatelem a záložka Packages
|
|
# u repozitáře zůstane prázdná.
|
|
LABEL org.opencontainers.image.source="https://gitea.spacilovi.eu/david-spacil/dice-counter" \
|
|
org.opencontainers.image.url="https://gitea.spacilovi.eu/david-spacil/dice-counter" \
|
|
org.opencontainers.image.title="dice-counter" \
|
|
org.opencontainers.image.description="Počitadlo kostek: telefon zapisuje skóre, notebook ukazuje zápisník" \
|
|
org.opencontainers.image.version="$VERSION"
|
|
|
|
RUN useradd --system --uid 1000 --home-dir /app --shell /usr/sbin/nologin dice-counter
|
|
|
|
WORKDIR /app
|
|
|
|
# Závislosti zvlášť a dřív než kód, ať se vrstva s pipem přestavuje jen tehdy,
|
|
# když se opravdu změnily.
|
|
COPY requirements.txt ./
|
|
RUN pip install --no-cache-dir -r requirements.txt
|
|
|
|
COPY console.py core.py net.py stats.py storage.py version.py web.py ./
|
|
COPY templates/ templates/
|
|
COPY static/ static/
|
|
RUN echo "$VERSION" > verze.txt
|
|
|
|
# Adresář pro databázi musí vzniknout už tady a patřit správnému uživateli —
|
|
# svazek, který Docker založí sám, by jinak patřil rootovi a appka běžící pod
|
|
# dice-counter by do něj nezapsala.
|
|
RUN install -d -o dice-counter -g dice-counter /data
|
|
VOLUME ["/data"]
|
|
|
|
ENV DICE_DB=/data/dice.db \
|
|
DICE_PORT=8000
|
|
|
|
EXPOSE 8000
|
|
USER dice-counter
|
|
|
|
# Bez curlu, ten ve slim image není. Stačí, že stránka odpoví — sahá i do
|
|
# databáze, takže se tím kontroluje i ta.
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
CMD python -c "import os,urllib.request; urllib.request.urlopen('http://127.0.0.1:' + os.environ.get('DICE_PORT','8000') + '/')"
|
|
|
|
CMD ["python", "web.py"]
|