热门标签 | 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()


推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • HelloDocker官方安装教程:https:docs.docker.cominstalllinuxdocker-ceubuntu进去选好对应系统发行版,照着命令复制-粘贴-运行 ... [详细]
  • 注:该文作者jpetazzo,该文章的原文为MultipleDockercontainersloggingtoasinglesyslog这里有一个简单方法展示了怎样在一个容器中运行 ... [详细]
  • 如何解决《将用户添加到Docker容器》经验,为你挑选了4个好方法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
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社区 版权所有