# 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"]