您能给我一个Dockerfile
的示例,在其中我可以将poetry.lock
和pyproject.toml
所需的所有软件包从Docker安装到我的镜像/容器中吗?
最佳答案
将poetry
与docker
一起使用时,要记住几件事。
安装
官方安装poetry
的方法是通过:
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -
这种方式允许poetry
及其依赖项与您的依赖项隔离。但是,在我看来,这并不是一件好事,原因有两个:poetry
版本可能会更新,并且会破坏您的构建。在这种情况下,您可以指定POETRY_VERSION
环境变量。安装程序会尊重它因此,我使用
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 virtualenvs.create false
设置将其关闭。开发与生产
如果您像我一样在开发和生产中使用相同的
Dockerfile
,则需要基于一些环境变量安装不同的依赖项集:poetry install $(test "$YOUR_ENV" == production && echo "--no-dev")
这样$YOUR_ENV
将控制将安装哪个依赖项集:全部(默认)或仅带有--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