无法在 docker 容器中安装依赖项

Can't install dependencies in docker container

我正在使用 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

Docker 文件:

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

以下对我有用:

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 关于构建过程和虚拟环境的固执己见的立场是有害的而不是有帮助的。

在这种情况下,您要复制到 docker 图像中的工件是 1) 您最近构建的库和 2)poetry.lock.

定义的经过测试的依赖项的驾驶室

第一个很简单,运行 poetry build -f wheel 而且你有一个非常便携的轮子。第二个还不容易,因为 poetry 不支持构建驾驶室(也许永远不会),并且 pip wheel 不接受 poetry.lock 的文件格式。因此,如果你想走这条路,你需要开发支持 poetry export -f requirements.txt > requirements.txtpoetryv1.0.0b7 相当稳定)的 Beta 版本,这样你就可以创建一个 requirements.txt 文件等同于您当前的锁定文件。

一旦你得到它,你就可以 运行 pip wheel -w dist -r requirements.txt,并且 最后 ,你已经完成了为 [=62= 创建所有工件] 图片。现在,以下将起作用:

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

优点

  • 在您的服务器中没有对 poetry 的不必要依赖(可能是相关的,因为它仍然是 <v1.0
  • 您跳过服务器中的 virtualenv 并将所有内容直接安装到系统中(您仍然可以选择自己创建一个 virtualenv 并将您的应用程序安装到其中,因为 installing your application into the system python's side-packages can lead to problems
  • 您的安装步骤不会运行针对 pypi,因此此部署保证在您测试的情况下正常工作(这在许多业务设置中非常重要)

缺点

  • 如果每次都手动的话有点痛苦,这里的目标执行者应该是CI/CD而不是人类
  • 如果您的工作站架构与 docker 图像不同,您构建和复制的轮子可能不兼容

如果您想在生产环境中使用 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