FROM python:3.10-slim AS app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /app
RUN addgroup fastapi_user --gid 1001 && useradd fastapi_user -u 1001 -g 1001 -s /bin/bash && \
pip install --upgrade pip && \
pip install poetry
COPY pyproject.toml poetry.lock /app/
RUN poetry config virtualenvs.create false && \
poetry install --no-dev --no-interaction --no-ansi
COPY . /app
USER fastapi_user
ENTRYPOINT ["gunicorn", "src.main:app"]
CMD ["--workers", "4", "--worker-class", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:8085"]
Из интересного тут это:
PYTHONDONTWRITEBYTECODE - отключает создание файлов байткода (.pyc), которые по дефолту хранятся в каталоге "__pycache__".
PYTHONUNBUFFERED - отключает буферизацию вывода python, заставляя его сразу отправлять данные на stdout и stderr. Это нужно, чтобы нормально видеть логи в контейнере в реальном времени, без задержек на буферизацию.
ENTRYPOINT как правило оставляем такой и берем из Dockerfile, а вот CMD частенько переопределяем в кубовом манифесте с помощью args на актуальные значения.
Не забываем про .dockerignore:
venv/
.env/
.venv/
*.pyc
*.pyo
*.pyd
*.cache
.DS_Store
Thumbs.db
.idea/
.vscode/
*.sublime-project
*.sublime-workspace
.git/
.gitignore
.gitattributes
.gitlab-ci.yml
README.md
tests/
coverage/
*.cover
*.coverage
*.pytest_cache
.tox/
.nox/
*.log
Dockerfile
docker-compose.yml
build/
dist/
job_token
Тут нет "__pycache__" потому что он само собой добавлен в .gitignore.
Сборка и запуск:
docker build -t fastapi-app .
docker run -d -p 8085:8085 fastapi-app
#docker