热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将Python诗歌与Docker集成

如何解决《将Python诗歌与Docker集成》经验,为你挑选了3个好方法。

你能给我一个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.tomlpoetry.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-devflag生成.

您可能还想添加更多选项以获得更好的体验:

    --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/pythonCMD指令中简单地引用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()


推荐阅读
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 离线环境下的Python及其第三方库安装指南
    在项目开发中,有时会遇到电脑只能连接内网或完全无法联网的情况。本文将详细介绍如何在这种环境下安装Python及其所需的第三方库,确保开发工作的顺利进行。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 本文介绍了在安装或运行 Python 项目时遇到的 'ModuleNotFoundError: No module named setuptools_rust' 错误,并提供了解决方案。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
author-avatar
蘑菇-2166_315
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有