在与docker一起使用poetry时,需要记住以下几点。
安装
安装poetry的正式方法是通过:curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
这种方式允许poetry及其依赖项与依赖项分离。但是,在我看来,这不是一件好事,原因有二:poetry版本可能会得到更新,它将破坏您的生成。在这种情况下,可以指定POETRY_VERSION环境变量。安装人员会尊重的
我不喜欢在没有任何可能的文件修改保护的情况下,把东西从internet导入容器的想法
所以,我使用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.toml或poetry.lock文件更改时重新安装它们。否则构建会很慢。为了实现工作缓存层,我们应该放置:COPY poetry.lock pyproject.toml /code/
在安装poetry之后,但在添加任何其他文件之前。
虚拟人
接下来要记住的是virtualenv创建。我们不需要它在docker中。它已经被孤立了。所以,我们使用poetry config settings.virtualenvs.create false设置来关闭它。
开发与生产
如果像我一样在开发和生产中使用相同的Dockerfile,则需要根据某些环境变量安装不同的依赖项集:poetry install $(test "$YOUR_ENV" == production && echo "--no-dev")
这样$YOUR_ENV将控制要安装的依赖项集:all(默认)或production only with --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=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