Не могу установить зависимости в 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