При использовании poetry
вместе с docker
.
Установка
необходимо учитывать несколько моментов. Официальный способ установки poetry
- через:
curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
Этот способ позволяет изолировать poetry
и его зависимости от ваших зависимостей.Но, на мой взгляд, это не очень хорошая вещь по двум причинам:
poetry
версия может получить обновление, и оно сломает вашу сборку.В этом случае вы можете указать POETRY_VERSION
переменную окружения.Установщик будет уважать это - Мне не нравится идея передавать вещи из Интернета в мои контейнеры без какой-либо защиты от возможных изменений файла
Итак, я использую 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
.
Вы также можете добавить еще несколько опций для лучшего опыта:
--no-interaction
не задавать никаких интерактивных вопросов --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-шаблон