274 votes

Intégration de Python Poetry avec Docker

Pouvez-vous me donner un exemple de Dockerfile dans lequel je peux installer tous les paquets dont j'ai besoin à partir de poetry.lock y pyproject.toml dans mon image/conteneur depuis Docker ?

15voto

funky-future Points 36

Voici un exemple dépouillé où l'on ajoute à une image d'abord une couche avec les dépendances (qui n'est construite que lorsque celles-ci ont changé), puis une couche avec le code source complet. Réglage de poetry à installer dans le système global site-packages laisse un artefact de configuration qui pourrait également être supprimé.

FROM python:alpine

WORKDIR /app

COPY poetry.lock pyproject.toml ./
RUN pip install --no-cache-dir --upgrade pip \
 && pip install --no-cache-dir poetry \
 \
 && poetry config settings.virtualenvs.create false \
 && poetry install --no-dev \
 \
 && pip uninstall --yes poetry \

COPY . ./

9voto

bneijt Points 16

J'ai créé une solution en utilisant un paquet de verrouillage (paquet qui dépend de toutes les versions dans le fichier de verrouillage). Il en résulte une installation pip-only propre sans fichiers d'exigences.

Les étapes sont : construire le paquet, construire le paquet de verrouillage, copier les deux roues dans votre conteneur, installer les deux roues avec pip.

L'installation est : poetry add --dev poetry-lock-package

Les étapes en dehors de la construction du docker sont :

poetry build
poetry run poetry-lock-package --build

Alors votre Dockerfile devrait contenir :

FROM python:3-slim

COPY dist/*.whl /

RUN pip install --no-cache-dir /*.whl \
    && rm -rf /*.whl

CMD ["python", "-m", "entry_module"]

6voto

Mattia Fantoni Points 121

Je vois que toutes les réponses ici utilisent la méthode pip pour installer Poetry afin d'éviter le problème de version. La méthode officielle d'installation de Poetry lit la variable d'environnement POETRY_VERSION si elle est définie pour installer la version la plus appropriée.

Il y a un problème dans github aquí et je pense que la solution de ce billet est assez intéressante :

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

-4voto

Aber Sheeran Points 15

construire une image sans python-poetry

FROM abersh/no-pypoetry as requirements

FROM python:3.7

# ... yourself commands

COPY --from=requirements /src/requirements.txt .

RUN pip install -r requirements.txt

# ... yourself commands

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X