-
-
Save usr-ein/c42d98abca3cb4632ab0c2c6aff8c88a to your computer and use it in GitHub Desktop.
| # syntax=docker/dockerfile:1 | |
| # Keep this syntax directive! It's used to enable Docker BuildKit | |
| # Based on https://github.com/python-poetry/poetry/discussions/1879?sort=top#discussioncomment-216865 | |
| # but I try to keep it updated (see history) | |
| ################################ | |
| # PYTHON-BASE | |
| # Sets up all our shared environment variables | |
| ################################ | |
| FROM python:3.9-slim as python-base | |
| # python | |
| ENV PYTHONUNBUFFERED=1 \ | |
| # prevents python creating .pyc files | |
| PYTHONDONTWRITEBYTECODE=1 \ | |
| \ | |
| # pip | |
| PIP_DISABLE_PIP_VERSION_CHECK=on \ | |
| PIP_DEFAULT_TIMEOUT=100 \ | |
| \ | |
| # poetry | |
| # https://python-poetry.org/docs/configuration/#using-environment-variables | |
| POETRY_VERSION=1.3.2 \ | |
| # make poetry install to this location | |
| POETRY_HOME="/opt/poetry" \ | |
| # make poetry create the virtual environment in the project's root | |
| # it gets named `.venv` | |
| POETRY_VIRTUALENVS_IN_PROJECT=true \ | |
| # do not ask any interactive question | |
| POETRY_NO_INTERACTION=1 \ | |
| \ | |
| # paths | |
| # this is where our requirements + virtual environment will live | |
| PYSETUP_PATH="/opt/pysetup" \ | |
| VENV_PATH="/opt/pysetup/.venv" | |
| # prepend poetry and venv to path | |
| ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" | |
| ################################ | |
| # BUILDER-BASE | |
| # Used to build deps + create our virtual environment | |
| ################################ | |
| FROM python-base as builder-base | |
| RUN apt-get update \ | |
| && apt-get install --no-install-recommends -y \ | |
| # deps for installing poetry | |
| curl \ | |
| # deps for building python deps | |
| build-essential | |
| # install poetry - respects $POETRY_VERSION & $POETRY_HOME | |
| # The --mount will mount the buildx cache directory to where | |
| # Poetry and Pip store their cache so that they can re-use it | |
| RUN --mount=type=cache,target=/root/.cache \ | |
| curl -sSL https://install.python-poetry.org | python3 - | |
| # copy project requirement files here to ensure they will be cached. | |
| WORKDIR $PYSETUP_PATH | |
| COPY poetry.lock pyproject.toml ./ | |
| # install runtime deps - uses $POETRY_VIRTUALENVS_IN_PROJECT internally | |
| RUN --mount=type=cache,target=/root/.cache \ | |
| poetry install --without=dev | |
| ################################ | |
| # DEVELOPMENT | |
| # Image used during development / testing | |
| ################################ | |
| FROM python-base as development | |
| ENV FASTAPI_ENV=development | |
| WORKDIR $PYSETUP_PATH | |
| # copy in our built poetry + venv | |
| COPY --from=builder-base $POETRY_HOME $POETRY_HOME | |
| COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH | |
| # quicker install as runtime deps are already installed | |
| RUN --mount=type=cache,target=/root/.cache \ | |
| poetry install --with=dev | |
| # will become mountpoint of our code | |
| WORKDIR /app | |
| EXPOSE 8000 | |
| CMD ["uvicorn", "--reload", "main:app"] | |
| ################################ | |
| # PRODUCTION | |
| # Final image used for runtime | |
| ################################ | |
| FROM python-base as production | |
| ENV FASTAPI_ENV=production | |
| COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH | |
| COPY ./app /app/ | |
| WORKDIR /app | |
| CMD ["gunicorn", "-k", "uvicorn.workers.UvicornWorker", "main:app"] |
Nice image, but I have a question. What is a sense use stage after set ENVs(https://gist.github.com/usr-ein/c42d98abca3cb4632ab0c2c6aff8c88a#file-dockerfile-L47) ? Finally, we will use prod or dev part
What's the use of PIP_DISABLE_PIP_VERSION_CHECK and PIP_DEFAULT_TIMEOUT if this is entirely based on Poetry?
What's the use of
PIP_DISABLE_PIP_VERSION_CHECKandPIP_DEFAULT_TIMEOUTif this is entirely based on Poetry?
@sn0opy Poetry is basically a wrapper around pip.
Any reason you're still using 1.3.2? Latest release as I'm typing this is 1.8.5 -- that's a pretty big differential
Any reason you're still using 1.3.2? Latest release as I'm typing this is 1.8.5 -- that's a pretty big differential
@ZachHandley I was also just looking at this and seems like this is a bit behind, it is using python 3.9 as of today there is 3.13 available
hi @usr-ein thanks for sharing. I wonder if it's possible to reduce the resulting image's size. any idea how?