Job state is changed under one RLock, the Dockerfile copies all root modules and imports them at build time, RIPEstat requests go through a retrying session with the sourceapp parameter (ripestat_sourceapp) and a capped Retry-After. Adds the summary and marks review findings 5-10 fixed. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
27 lines
1.1 KiB
Docker
27 lines
1.1 KiB
Docker
FROM python:3.11-slim
|
|
|
|
ENV PYTHONUNBUFFERED=1 \
|
|
PYTHONDONTWRITEBYTECODE=1 \
|
|
RIPE_DATA_DIR=/data
|
|
|
|
WORKDIR /app
|
|
|
|
COPY requirements.txt constraints.txt ./
|
|
RUN pip install --no-cache-dir -c constraints.txt -r requirements.txt
|
|
|
|
# Все модули приложения из корня (тесты и прочее лежат в подкаталогах или исключены .dockerignore)
|
|
COPY *.py ./
|
|
# Забытый или сломанный модуль ломает сборку, а не запуск
|
|
RUN python -c "import api_server, collector_daemon, db, healthcheck"
|
|
|
|
# Без root; том /data создаётся с владельцем ripe (именованный том наследует его при первом создании)
|
|
RUN useradd --system --uid 10001 --no-create-home ripe \
|
|
&& mkdir /data && chown ripe /data
|
|
USER ripe
|
|
VOLUME /data
|
|
|
|
EXPOSE 8000
|
|
|
|
# exec-форма: SIGTERM доходит до процесса. Сборщик переопределяет команду в docker-compose.yml
|
|
CMD ["uvicorn", "api_server:app", "--host", "0.0.0.0", "--port", "8000"]
|