Skip to content

Instantly share code, notes, and snippets.

@pszponder
Forked from usr-ein/Dockerfile
Created January 25, 2024 05:50
Show Gist options
  • Select an option

  • Save pszponder/a1fca598bb2453dca76f07ceafd3c324 to your computer and use it in GitHub Desktop.

Select an option

Save pszponder/a1fca598bb2453dca76f07ceafd3c324 to your computer and use it in GitHub Desktop.

Revisions

  1. @usr-ein usr-ein revised this gist Feb 21, 2023. 1 changed file with 3 additions and 0 deletions.
    3 changes: 3 additions & 0 deletions Dockerfile
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,6 @@
    # 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)

  2. @usr-ein usr-ein revised this gist Feb 20, 2023. 1 changed file with 8 additions and 4 deletions.
    12 changes: 8 additions & 4 deletions Dockerfile
    Original file line number Diff line number Diff line change
    @@ -13,7 +13,6 @@ ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    \
    # pip
    PIP_NO_CACHE_DIR=off \
    PIP_DISABLE_PIP_VERSION_CHECK=on \
    PIP_DEFAULT_TIMEOUT=100 \
    \
    @@ -51,14 +50,18 @@ RUN apt-get update \
    build-essential

    # install poetry - respects $POETRY_VERSION & $POETRY_HOME
    RUN curl -sSL https://install.python-poetry.org | python3 -
    # 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 poetry install --without=dev
    RUN --mount=type=cache,target=/root/.cache \
    poetry install --without=dev


    ################################
    @@ -74,7 +77,8 @@ 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 poetry install --with=dev
    RUN --mount=type=cache,target=/root/.cache \
    poetry install --with=dev

    # will become mountpoint of our code
    WORKDIR /app
  3. @usr-ein usr-ein revised this gist Feb 20, 2023. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion Dockerfile
    Original file line number Diff line number Diff line change
    @@ -58,7 +58,7 @@ WORKDIR $PYSETUP_PATH
    COPY poetry.lock pyproject.toml ./

    # install runtime deps - uses $POETRY_VIRTUALENVS_IN_PROJECT internally
    RUN poetry install --no-dev
    RUN poetry install --without=dev


    ################################
  4. @usr-ein usr-ein revised this gist Feb 20, 2023. 1 changed file with 17 additions and 5 deletions.
    22 changes: 17 additions & 5 deletions Dockerfile
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,10 @@
    # 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
    ################################
    # PYTHON-BASE
    # Sets up all our shared environment variables
    ################################
    FROM python:3.9-slim as python-base

    # python
    @@ -35,7 +38,10 @@ ENV PYTHONUNBUFFERED=1 \
    ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH"


    # `builder-base` stage is used to build deps + create our virtual environment
    ################################
    # 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 \
    @@ -55,7 +61,10 @@ COPY poetry.lock pyproject.toml ./
    RUN poetry install --no-dev


    # `development` image is used during development / testing
    ################################
    # DEVELOPMENT
    # Image used during development / testing
    ################################
    FROM python-base as development
    ENV FASTAPI_ENV=development
    WORKDIR $PYSETUP_PATH
    @@ -65,7 +74,7 @@ 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 poetry install
    RUN poetry install --with=dev

    # will become mountpoint of our code
    WORKDIR /app
    @@ -74,7 +83,10 @@ EXPOSE 8000
    CMD ["uvicorn", "--reload", "main:app"]


    # `production` image used for runtime
    ################################
    # PRODUCTION
    # Final image used for runtime
    ################################
    FROM python-base as production
    ENV FASTAPI_ENV=production
    COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH
  5. @usr-ein usr-ein revised this gist Feb 20, 2023. 1 changed file with 3 additions and 3 deletions.
    6 changes: 3 additions & 3 deletions Dockerfile
    Original file line number Diff line number Diff line change
    @@ -2,7 +2,7 @@
    # but I try to keep it updated (see history)

    # `python-base` sets up all our shared environment variables
    FROM python:3.8.1-slim as python-base
    FROM python:3.9-slim as python-base

    # python
    ENV PYTHONUNBUFFERED=1 \
    @@ -16,7 +16,7 @@ ENV PYTHONUNBUFFERED=1 \
    \
    # poetry
    # https://python-poetry.org/docs/configuration/#using-environment-variables
    POETRY_VERSION=1.0.3 \
    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
    @@ -45,7 +45,7 @@ RUN apt-get update \
    build-essential

    # install poetry - respects $POETRY_VERSION & $POETRY_HOME
    RUN curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
    RUN curl -sSL https://install.python-poetry.org | python3 -

    # copy project requirement files here to ensure they will be cached.
    WORKDIR $PYSETUP_PATH
  6. @usr-ein usr-ein created this gist Feb 20, 2023.
    83 changes: 83 additions & 0 deletions Dockerfile
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,83 @@
    # 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.8.1-slim as python-base

    # python
    ENV PYTHONUNBUFFERED=1 \
    # prevents python creating .pyc files
    PYTHONDONTWRITEBYTECODE=1 \
    \
    # pip
    PIP_NO_CACHE_DIR=off \
    PIP_DISABLE_PIP_VERSION_CHECK=on \
    PIP_DEFAULT_TIMEOUT=100 \
    \
    # poetry
    # https://python-poetry.org/docs/configuration/#using-environment-variables
    POETRY_VERSION=1.0.3 \
    # 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` stage is 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
    RUN curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python

    # 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 poetry install --no-dev


    # `development` image is 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 poetry install

    # will become mountpoint of our code
    WORKDIR /app

    EXPOSE 8000
    CMD ["uvicorn", "--reload", "main:app"]


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