您能给我一个Dockerfile的示例,在其中我可以将poetry.lockpyproject.toml所需的所有软件包从Docker安装到我的镜像/容器中吗?

最佳答案

poetrydocker一起使用时,要记住几件事。
安装
官方安装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.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标志的生产。
    您可能还想添加一些其他选项以获得更好的体验:
  • --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
  • 08-28 13:48