在與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