Python S2I 镜像
概览
OpenShift Container Platform提供支持 S2I的 Python镜像,用于构建和运行Python应用程序。Python S2I构建器镜像使用一些必需的依赖项组装您的应用程序源,以创建包含Python应用程序的新镜像。生成的镜像可以由OpenShift Container Platform或容器运行时运行。
版本
目前,OpenShift Container Platform提供的版本 2.7, 3.3, 3.4和 3.5的Python。
镜像
根据您的需要,这些镜像有两种形式:
- RHEL 7
- CentOS 7
基于RHEL 7的镜像
RHEL 7镜像可通过Red Hat Registry获得:
$ docker pull registry.redhat.io/rhscl/python-27-rhel7
$ docker pull registry.redhat.io/openshift3/python-33-rhel7
$ docker pull registry.redhat.io/rhscl/python-34-rhel7
$ docker pull registry.redhat.io/rhscl/python-35-rhel7
基于CentOS 7的镜像
这些镜像可在Docker Hub上获得:
$ docker pull centos/python-27-centos7
$ docker pull openshift/python-33-centos7
$ docker pull centos/python-34-centos7
$ docker pull centos/python-35-centos7
要使用这些镜像,您可以直接从这些镜像注册表(image registry)访问它们,也可以将它们 推送到OpenShift Container Platform容器镜像注册表中。此外,您可以在容器镜像注册表或外部位置创建 指向镜像的镜像流(image stream)。然后,您的OpenShift Container Platform资源可以引用ImageStream。您可以从下边链接中找到 所有提供的OpenShift Container Platform镜像的示例镜像流定义。
构建过程
S2I通过将源代码注入容器并让容器准备要执行的源代码来生成可立即运行的镜像。它执行以下步骤:
- 从构建器(bulid)镜像启动容器。
- 下载应用程序源。
- 将脚本和应用程序源流式传输到构建器镜像容器中。
- 运行assemble 脚本(来自构建器镜像)。
- 保存最终镜像。
配置
Python镜像支持许多环境变量,可以设置这些变量来控制Python运行时的配置和行为。
要将这些环境变量设置为镜像的一部分,可以将它们放入 源代码存储库中的.s2i /environment文件中,或者在构建配置定义的环境部分中定义它们sourceStrategy
。
您还可以在创建新应用程序时设置要与现有镜像一起使用的环境变量 ,或者通过 更新现有对象(如部署配置)的环境变量。
:heavy_exclamation_mark:
控制构建行为的环境变量必须设置为s2i构建配置的一部分,或者设置在.s2i/environment文件中,以使它们可用于构建步骤。
变量名 | 描述 |
---|---|
APP_FILE | 此变量指定传递给Python解释器的文件名,该解释器负责启动应用程序。默认情况下,此变量设置为app.py. |
APP_MODULE | 此变量指定可调用的WSGI。它遵循模式$(MODULE_NAME):$(VARIABLE_NAME) ,其中模块名称是完整的虚线路径,变量名称是指定模块内的函数。如果您有setup.py 用于安装应用程序,则可以从该文件中读取模块名称,并且变量默认为application 。有一个示例 setup-test-app 可用。 |
APP_CONFIG | 此变量指示具有gunicorn配置的有效Python文件的路径 。 |
DISABLE_COLLECTSTATIC | 将其设置为非空值以禁止manage.py collectstatic 在构建期间执行。只影响Django项目。 |
DISABLE_MIGRATE | 将其设置为非空值以禁止manage.py migrate 在生成的图像运行时执行。只影响Django项目。 |
PIP_INDEX_URL | 设置此变量以使用自定义索引URL或镜像在构建过程中下载所需的包。这仅影响requirements.txt文件中列出的包 。 |
WEB_CONCURRENCY | 设置此项以更改worker数量的默认设置 。默认情况下,此值设置为可用核心数乘以4。 |
ENABLE_PIPENV | 设置此变量以使用Pipenv(更高级别的Python打包工具)来管理应用程序的依赖关系。仅当您的项目包含正确格式化的Pipfile和Pipfile.lock时,才应使用此方法。 |
APP_SCRIPT | 用于从脚本文件运行应用程序。这应该是一个脚本文件的路径(默认为app.sh 除非设置为null),它将运行以启动应用程序。 |
源存储库布局
您不需要在现有Python项目的存储库中更改任何内容。但是,如果存在以下文件,则会影响构建过程的行为:
requirements.txt
要安装的依赖项列表
pip
。格式记录 在这里。Pipfile
对于requirements.txt的增强,pipfile项目正处于活动的设计和开发中,格式记录在这里。将
ENABLE_PIPENV
环境变量设置为true以处理此文件。setup.py
配置项目的各个方面,包括安装依赖项,如此 处所述。对于大多数项目,只需使用
requirements.txt
或Pipfile
即可。将DISABLE_SETUP_PY_PROCESSING
环境变量设置为true以跳过此文件的处理。
运行策略
由s2i-python生成的容器镜像按以下的优先顺序执行项目:
Gunicorn
Gunicorn WSGI HTTP服务器用于在安装时为您的应用程序提供服务。可以通过将其列在
requirements.txt
文件或文件setup.py
的install_requires
部分中来安装它。如果
wsgi.py
存储库中存在已命名的文件,则它将用作应用程序的入口点。这可以用环境变量APP_MODULE
覆盖。默认情况下,此文件存在于Django项目中。如果您的Django和Gunicorn都符合要求,您的Django项目将自动使用Gunicorn。
Django开发服务器
如果您的Django符合要求但没有Gunicorn,那么您的应用程序将使用Django提供的开发Web服务器。但是,建议不要将其用于生产环境。
Python脚本
这将用于提供运行应用程序的Python代码文件的位置。它将用于通过
APP_FILE
环境变量指定Python脚本的路径,默认为app.py
命名的文件(如果存在)。该脚本将传递给常规Python解释器以启动您的应用程序。应用脚本文件
这是执行应用程序的最常用方法。它将用于通过
APP_SCRIPT
环境变量指定可执行脚本文件的路径,默认为app.sh
命名的文件(如果存在)。脚本直接执行以启动您的应用程序。
热部署
热部署允许您快速make和部署对应用程序的更改,而无需生成新的S2I构建。如果您使用Django,热部署开箱即用。
要在使用Gunicorn时启用热部署,请确保在存储库中有一个Gunicorn配置文件, 其reload
选项设置为true。使用APP_CONFIG
环境变量指定配置文件 。例如,请参阅该oc new-app
命令。您可以使用该 oc set env
命令更新现有对象的环境变量。
:exclamation:
您应该只在开发或调试时使用此选项; 建议不要在生产环境中启用此功能。
要在正在运行的窗格中更改源代码,请使用以下 oc rsh
命令输入容器id:
$ oc rsh <pod_id>
进入正在运行的容器后,当前目录将设置为 /opt/app-root/src,源代码位于此处。
也可以看看
可以在https://github.com/sclorg/s2i-python-container上找到Dockerfile和其他来源。在该存储库中,您还可以找到其他版本的Python环境Dockerfiles。CentOS的Dockerfile命名为Dockerfile
,RHEL7的Dockerfile命名为Dockerfile.rhel7
,RHEL8的命名为Dockerfile.rhel8
。