Не могу установить зависимости в Docker-контейнере

Я использую poetry библиотека для управления зависимостями проекта, поэтому, когда я использую

docker build --tag=helloworld .

Я получил эту ошибку

[AttributeError]               
'NoneType' object has no attribute 'group'  

Установка перерывов на umongo (2.1.0) пакет

Вот мой pyproject.toml файл

[tool.poetry.dependencies]
python = "^3.7.0"
asyncio = "^3.4"
aiohttp = "^3.4"
motor = "^2.0"
umongo = "^2.0"
pyyaml = "^3.13"

[tool.poetry.dev-dependencies]
pytest = "^3.4"
black = {version = "^18.3-alpha.0",allows-prereleases = true}
mypy = "^0.650.0"
wemake-python-styleguide = "^0.5.1"
pytest-mock = "^1.10"
pytest-asyncio = "^0.9.0"
pytest-aiohttp = "^0.3.0"

А также poetry.lock https://pastebin.com/kUjAKJHM

Dockerfile:

FROM python:3.7.1-alpine

RUN mkdir -p /opt/project/todo_api
RUN pip --no-cache-dir install poetry

COPY ./pyproject.toml /opt/project
COPY poetry.lock /opt/project

RUN cd /opt/project && poetry install --no-dev

COPY ./todo_api /opt/project/todo_api
COPY ./todo_api.yml /opt/project/todo_api.yml

WORKDIR /opt/project

ENTRYPOINT poetry run python -m aiohttp.web todo_api.main:main

3 ответа

Решение

Следующие работы для меня:

FROM python:3.7.1-alpine

WORKDIR /opt/project

RUN pip install --upgrade pip && pip --no-cache-dir install poetry

COPY ./pyproject.toml .

RUN poetry install --no-dev

с pyproject.toml:

[tool.poetry]
name = "57331667"
version = "0.0.1"
authors = ["skufler <skufler@email.com>"]

[tool.poetry.dependencies]
python = "^3.7.0"
asyncio = "^3.4"
aiohttp = "^3.4"
motor = "^2.0"
umongo = "^2.0"
pyyaml = "^3.13"

[tool.poetry.dev-dependencies]
pytest = "^3.4"
black = {version = "^18.3-alpha.0",allows-prereleases = true}
mypy = "^0.650.0"
wemake-python-styleguide = "^0.5.1"
pytest-mock = "^1.10"
pytest-asyncio = "^0.9.0"
pytest-aiohttp = "^0.3.0"

Затем:

docker build --tag=57331667 --file=./Dockerfile .

Результаты:

...
Creating virtualenv 57331667-py3.7 in /root/.cache/pypoetry/virtualenvs
Updating dependencies
Resolving dependencies...

Writing lock file


Package operations: 15 installs, 0 updates, 0 removals

  - Installing idna (2.8)
  - Installing multidict (4.5.2)
  - Installing six (1.12.0)
  - Installing async-timeout (3.0.1)
  - Installing attrs (18.2.0)
  - Installing chardet (3.0.4)
  - Installing marshmallow (2.19.5)
  - Installing pymongo (3.8.0)
  - Installing python-dateutil (2.8.0)
  - Installing yarl (1.3.0)
  - Installing aiohttp (3.5.4)
  - Installing asyncio (3.4.3)
  - Installing motor (2.0.0)
  - Installing pyyaml (3.13)
  - Installing umongo (2.1.0)
Removing intermediate container c6a9c7652b5c
 ---> 89354562cf16
Successfully built 89354562cf16
Successfully tagged 57331667:latest

Альтернативный подход

Не устанавливать poetry в вашу среду развертывания. Это инструмент управления пакетами, целью которого является улучшение разработки и совместной работы над библиотеками. Если вы хотите развернуть приложение, вам нужен только установщик пакета (читайте: pip) - и самоуверенная позиция poetry относительно процесса сборки и виртуальных сред, скорее вредно, чем полезно.

В этом случае артефакты, которые вы хотите скопировать в образ докера, это: 1) ваша последняя сборка библиотеки, с которой вы работаете, и 2) рулетка проверенных зависимостей, как определено poetry.lock,

Первый легкий, беги poetry build -f wheel и у вас есть красиво переносимое колесо. Второе еще не легко, потому что poetry не поддерживает строительство рулевых рубок (и, возможно, никогда не будет), и pip wheel не принимает poetry.lockФормат файла. Так что если вы хотите пойти по этому пути, вам нужно поработать над альфа-сборкой poetry (v1.0.0a4 довольно стабильный), который поддерживает poetry export -f requirements.txt, который позволяет вам создать requirements.txt файл, эквивалентный вашему текущему файлу блокировки.

Как только вы это получили, вы можете запустить pip wheel -w dist -r requirements.txtи, наконец, вы закончили создавать все артефакты для образа докера. Теперь будет работать следующее:

FROM python:3.7.1-alpine

WORKDIR /opt/project

COPY dist dist

RUN pip install --no-index --find-links dist todo_api

ENTRYPOINT python -m aiohttp.web todo_api.main:main

Pros

  • нет ненужной зависимости от poetry на вашем сервере (может быть актуальным, так как он все еще <v1.0)
  • вы пропускаете virtualenv на своем сервере и устанавливаете все прямо в систему
  • ваш шаг установки не работает с pypi, поэтому это развертывание гарантированно будет работать, насколько вы его тестировали (это очень важный момент во многих бизнес-настройках)

Cons

  • Это немного больно, если вы делаете это каждый раз вручную, целевой исполнитель здесь должен быть CI/CD, а не человеком
  • если архитектура вашей рабочей станции и образ док-станции различаются, колёса, которые вы создаете и копируете, могут быть несовместимы

Если вы хотите установить его с помощью pip3 в рабочей среде, вот как последняя версия Poetry (конец 2021 г.) может экспортировать файл requirements.txt:

      # Production with no development dependencies
poetry export --no-interaction --no-ansi --without-hashes --format requirements.txt --output ./requirements.prod.txt

# For development, including development dependencies
poetry export --no-interaction --no-ansi --without-hashes --format requirements.txt --dev --output ./requirements.dev.txt
Другие вопросы по тегам