将 Python 诗歌与 Docker 集成

新手上路,请多包涵

你能给我一个 Dockerfile 的例子,我可以从 poetry.lockpyproject.toml 安装我需要的所有包到我的镜像/容器中吗?

原文由 Alex Bodea 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 524
1 个回答

使用 poetrydocker 时,有几件事情要记住。

安装

安装 poetry 的官方方法是通过:

 curl -sSL https://raw.githubusercontent.com/python-poetry/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>=1.0"]
build-backend = "poetry.masonry.api"

它将保护您免受本地环境和 docker 环境之间的版本不匹配。

缓存依赖项

我们想要缓存我们的需求,并且仅在 pyproject.tomlpoetry.lock 文件更改时重新安装它们。否则构建会很慢。为了实现工作缓存层,我们应该把:

 COPY poetry.lock pyproject.toml /code/

在安装 poetry 之后,但在添加任何其他文件之前。

虚拟环境

接下来要记住的是 virtualenv 创建。我们在 docker 中不需要它。它已经被隔离了。因此,我们使用 poetry config 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=1.0.0

# 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 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-template

2019-12-17 更新

  • 更新 poetry 到 1.0

原文由 sobolevn 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题