Интеграция Python Poetry с Docker - PullRequest
0 голосов
/ 18 декабря 2018

Не могли бы вы дать мне пример Dockerfile, в котором я могу установить все необходимые мне пакеты от Стихи и pyproject.toml в свой образ / контейнер из Docker?

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

При использовании poetry вместе с docker.

Установка

необходимо учитывать несколько моментов. Официальный способ установки poetry - через:

curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python

Этот способ позволяет изолировать poetry и его зависимости от ваших зависимостей.Но, на мой взгляд, это не очень хорошая вещь по двум причинам:

  1. poetry версия может получить обновление, и оно сломает вашу сборку.В этом случае вы можете указать POETRY_VERSION переменную окружения.Установщик будет уважать это
  2. Мне не нравится идея передавать вещи из Интернета в мои контейнеры без какой-либо защиты от возможных изменений файла

Итак, я использую pip install 'poetry==$POETRY_VERSION'.Как вы можете видеть, я все же рекомендую прикрепить вашу версию.

Кроме того, также добавьте эту версию в ваш pyproject.toml:

[build-system]
# Should be the same as `$POETRY_VERSION`:
requires = ["poetry==0.12.11"]
build-backend = "poetry.masonry.api"

Это защитит вас от несоответствия версий между вашимилокальные и docker среды.

Кэширование зависимостей

Мы хотим кэшировать наши требования и переустанавливать их только при изменении файлов pyproject.toml или poetry.lock.В противном случае сборка будет медленной.Для достижения рабочего уровня кэша мы должны поставить:

COPY poetry.lock pyproject.toml /code/

После установки poetry, но до добавления других файлов.

Virtualenv

Следующая вещьиметь в виду, это virtualenv создание.Нам это не нужно в docker.Он уже изолирован.Итак, мы используем настройку poetry config settings.virtualenvs.create false, чтобы отключить его.

Разработка против производства

Если вы используете тот же Dockerfile для разработки и производства, что и я, вам нужно будет установитьразличные наборы зависимостей, основанные на некоторой переменной среды:

poetry install $(test "$YOUR_ENV" == production && echo "--no-dev")

Таким образом, $YOUR_ENV будет контролировать, какой набор зависимостей будет установлен: все (по умолчанию) или только производственные с флагом --no-dev.

Вы также можете добавить еще несколько опций для лучшего опыта:

  1. --no-interaction не задавать никаких интерактивных вопросов
  2. --no-ansi пометить, чтобы сделать ваш вывод более удобным для журнала

Результат

В итоге вы получите нечто похожее на:

FROM python:3.6.6-alpine3.7

ARG YOUR_ENV

ENV YOUR_ENV=${YOUR_ENV} \
  PYTHONFAULTHANDLER=1 \
  PYTHONUNBUFFERED=1 \
  PYTHONHASHSEED=random \
  PIP_NO_CACHE_DIR=off \
  PIP_DISABLE_PIP_VERSION_CHECK=on \
  PIP_DEFAULT_TIMEOUT=100 \
  POETRY_VERSION=0.12.11

# System deps:
RUN pip install "poetry==$POETRY_VERSION"

# Copy only requirements to cache them in docker layer
WORKDIR /code
COPY poetry.lock pyproject.toml /code/

# Project initialization:
RUN poetry config settings.virtualenvs.create false \
  && poetry install $(test "$YOUR_ENV" == production && echo "--no-dev") --no-interaction --no-ansi

# Creating folders, and files for a project:
COPY . /code

Вы можете найти полностью работающий пример из реальной жизни здесь: wemake-django-шаблон

0 голосов
/ 22 февраля 2019

Это минимальная конфигурация, которая работает для меня:

FROM python:3.7

ENV PIP_DISABLE_PIP_VERSION_CHECK=on

RUN pip install poetry

WORKDIR /app
COPY poetry.lock pyproject.toml /app/

RUN poetry config settings.virtualenvs.create false
RUN poetry install --no-interaction

COPY . /app

Обратите внимание, что она не так безопасна, как конфигурация @ sobolevn .

Как мелочи, я будудобавьте, что , если редактируемые установки будут возможны для pyproject.toml проектов , можно удалить одну или две строки:

FROM python:3.7

ENV PIP_DISABLE_PIP_VERSION_CHECK=on

WORKDIR /app
COPY poetry.lock pyproject.toml /app/

RUN pip install -e .

COPY . /app
0 голосов
/ 14 января 2019

Вот раздельный пример, где сначала к изображению добавляется слой с зависимостями (который создается только при их изменении), а затем слой с полным исходным кодом.Установка poetry для установки в глобальный site-packages оставляет артефакт конфигурации, который также можно удалить.

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 . ./
...