作者:蘑菇-2166_315 | 来源:互联网 | 2022-11-24 16:24
你能给我一个Dockerfile的例子,我可以在其中将poetry.lock和pyproject.toml所需的所有软件包安装到Docker的图像/容器中吗?
1> sobolevn..:
poetry
与...一起使用时要记住几件事docker
.
安装
官方安装方式poetry
是:
curl -sSL https://raw.githubusercontent.com/sdispater/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==0.12.11"]
build-backend = "poetry.masonry.api"
它可以保护您免受本地和docker
环境之间版本不匹配的影响.
缓存依赖项
我们希望缓存我们的要求,只有重新安装时pyproject.toml
或poetry.lock
文件更改.否则构建将会很慢.要实现工作缓存层,我们应该:
COPY poetry.lock pyproject.toml /code/
在后poetry
安装,但在此之前添加任何其他文件.
VIRTUALENV
接下来要记住的是virtualenv
创造.我们不需要它docker
.它已经被孤立了.因此,我们使用poetry config settings.virtualenvs.create false
设置将其关闭.
发展与生产
如果您Dockerfile
像我一样使用相同的开发和生产,则需要根据某些环境变量安装不同的依赖关系集:
poetry install $(test "$YOUR_ENV" == production && echo "--no-dev")
这种方式$YOUR_ENV
将控制将安装哪些依赖项集:all(默认)或仅使用--no-dev
flag生成.
您可能还想添加更多选项以获得更好的体验:
--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=0.12.11
# 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 settings.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
2> maciek..:
这是对我有用的最小配置:
FROM python:3.7
ENV PIP_DISABLE_PIP_VERSION_CHECK=on
RUN pip install poetry
WORKDIR /app
COPY poetry.lock pyproject.toml /app/
RUN poetry config settings.virtualenvs.create false
RUN poetry install --no-interaction
COPY . /app
请注意,它不如@sobolevn的configuration安全。
作为一个琐事,我要补充一点,如果pyproject.toml
项目可以进行可编辑的安装,则可以删除一两行:
FROM python:3.7
ENV PIP_DISABLE_PIP_VERSION_CHECK=on
WORKDIR /app
COPY poetry.lock pyproject.toml /app/
RUN pip install -e .
COPY . /app
3> Claudio..:
使用Poetry和venv的多阶段Docker构建
不要禁用virtualenv创建。Virtualenvs在Docker构建中达到了一个目的,因为它们提供了一种优雅的方式来利用多阶段构建。简而言之,您的构建阶段会将所有内容安装到virtualenv中,最后一步只是将virtualenv复制到一个小映像中。
如果您不介意使用诗歌预发行版,则可以poetry export
在之前先使用并安装固定的要求。这将允许您使用Docker构建缓存,而不必仅仅因为更改了代码行而重新安装了依赖项。
请勿poetry install
用于安装代码,因为它将执行可编辑的安装。而是使用poetry build
构建轮子,然后将其通过pip安装到您的virtualenv中。(由于PEP 517,整个过程也可以用一个简单的方法执行pip install .
,但是由于构建隔离,您最终将安装另一本《 Poetry》。)
这是一个示例文件,该文件将Flask应用安装到Alpine映像中,并依赖于Postgres。本示例使用入口点脚本来激活virtualenv。但是通常,没有入口点脚本就可以了,因为您可以/venv/bin/python
在CMD
指令中简单地引用Python二进制文件。
Docker文件
FROM python:3.7.4-alpine3.10 as base
ENV PYTHOnFAULTHANDLER=1 \
PYTHOnHASHSEED=random \
PYTHOnUNBUFFERED=1
WORKDIR /app
FROM base as builder
ENV PIP_DEFAULT_TIMEOUT=100 \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
PIP_NO_CACHE_DIR=1 \
POETRY_VERSION=1.0.0b1
RUN apk add --no-cache gcc libffi-dev musl-dev postgresql-dev
RUN pip install "poetry==$POETRY_VERSION"
RUN python -m venv /venv
COPY pyproject.toml poetry.lock ./
RUN poetry export -f requirements.txt | /venv/bin/pip install -r /dev/stdin
COPY . .
RUN poetry build && /venv/bin/pip install dist/*.whl
FROM base as final
RUN apk add --no-cache libffi libpq
COPY --from=builder /venv /venv
COPY docker-entrypoint.sh wsgi.py ./
CMD ["./docker-entrypoint.sh"]
docker-entrypoint.sh
#!/bin/sh
set -e
. /venv/bin/activate
while ! flask db upgrade
do
echo "Retry..."
sleep 1
done
exec gunicorn --bind 0.0.0.0:5000 --forwarded-allow-ips='*' wsgi:app
wsgi.py
import your_app
app = your_app.create_app()