Python S2I 鏡像
概覽
OpenShift Container Platform提供支持 S2I的 Python鏡像,用于構(gòu)建和運(yùn)行Python應(yīng)用程序。Python S2I構(gòu)建器鏡像使用一些必需的依賴項(xiàng)組裝您的應(yīng)用程序源,以創(chuàng)建包含Python應(yīng)用程序的新鏡像。生成的鏡像可以由OpenShift Container Platform或容器運(yùn)行時(shí)運(yùn)行。
版本
目前,OpenShift Container Platform提供的版本 2.7, 3.3, 3.4和 3.5的Python。
鏡像
根據(jù)您的需要,這些鏡像有兩種形式:
- 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容器鏡像注冊表中。此外,您可以在容器鏡像注冊表或外部位置創(chuàng)建 指向鏡像的鏡像流(image stream)。然后,您的OpenShift Container Platform資源可以引用ImageStream。您可以從下邊鏈接中找到 所有提供的OpenShift Container Platform鏡像的示例鏡像流定義。
構(gòu)建過程
S2I通過將源代碼注入容器并讓容器準(zhǔn)備要執(zhí)行的源代碼來生成可立即運(yùn)行的鏡像。它執(zhí)行以下步驟:
- 從構(gòu)建器(bulid)鏡像啟動(dòng)容器。
- 下載應(yīng)用程序源。
- 將腳本和應(yīng)用程序源流式傳輸?shù)綐?gòu)建器鏡像容器中。
- 運(yùn)行assemble 腳本(來自構(gòu)建器鏡像)。
- 保存最終鏡像。
有關(guān)構(gòu)建過程的詳細(xì)概述,請參見S2I構(gòu)建過程。
配置
Python鏡像支持許多環(huán)境變量,可以設(shè)置這些變量來控制Python運(yùn)行時(shí)的配置和行為。
要將這些環(huán)境變量設(shè)置為鏡像的一部分,可以將它們放入 源代碼存儲庫中的.s2i /environment文件中,或者在構(gòu)建配置定義的環(huán)境部分中定義它們sourceStrategy。
您還可以在創(chuàng)建新應(yīng)用程序時(shí)設(shè)置要與現(xiàn)有鏡像一起使用的環(huán)境變量 ,或者通過 更新現(xiàn)有對象(如部署配置)的環(huán)境變量。
:heavy_exclamation_mark:
控制構(gòu)建行為的環(huán)境變量必須設(shè)置為s2i構(gòu)建配置的一部分,或者設(shè)置在.s2i/environment文件中,以使它們可用于構(gòu)建步驟。
| 變量名 | 描述 |
|---|---|
APP_FILE |
此變量指定傳遞給Python解釋器的文件名,該解釋器負(fù)責(zé)啟動(dòng)應(yīng)用程序。默認(rèn)情況下,此變量設(shè)置為app.py. |
APP_MODULE |
此變量指定可調(diào)用的WSGI。它遵循模式$(MODULE_NAME):$(VARIABLE_NAME),其中模塊名稱是完整的虛線路徑,變量名稱是指定模塊內(nèi)的函數(shù)。如果您有setup.py用于安裝應(yīng)用程序,則可以從該文件中讀取模塊名稱,并且變量默認(rèn)為application。有一個(gè)示例 setup-test-app 可用。 |
APP_CONFIG |
此變量指示具有gunicorn配置的有效Python文件的路徑 。 |
DISABLE_COLLECTSTATIC |
將其設(shè)置為非空值以禁止manage.py collectstatic 在構(gòu)建期間執(zhí)行。只影響Django項(xiàng)目。 |
DISABLE_MIGRATE |
將其設(shè)置為非空值以禁止manage.py migrate 在生成的圖像運(yùn)行時(shí)執(zhí)行。只影響Django項(xiàng)目。 |
PIP_INDEX_URL |
設(shè)置此變量以使用自定義索引URL或鏡像在構(gòu)建過程中下載所需的包。這僅影響requirements.txt文件中列出的包 。 |
WEB_CONCURRENCY |
設(shè)置此項(xiàng)以更改worker數(shù)量的默認(rèn)設(shè)置 。默認(rèn)情況下,此值設(shè)置為可用核心數(shù)乘以4。 |
ENABLE_PIPENV |
設(shè)置此變量以使用Pipenv(更高級別的Python打包工具)來管理應(yīng)用程序的依賴關(guān)系。僅當(dāng)您的項(xiàng)目包含正確格式化的Pipfile和Pipfile.lock時(shí),才應(yīng)使用此方法。 |
APP_SCRIPT |
用于從腳本文件運(yùn)行應(yīng)用程序。這應(yīng)該是一個(gè)腳本文件的路徑(默認(rèn)為app.sh除非設(shè)置為null),它將運(yùn)行以啟動(dòng)應(yīng)用程序。 |
源存儲庫布局
您不需要在現(xiàn)有Python項(xiàng)目的存儲庫中更改任何內(nèi)容。但是,如果存在以下文件,則會(huì)影響構(gòu)建過程的行為:
-
requirements.txt
要安裝的依賴項(xiàng)列表
pip。格式記錄 在這里。 -
Pipfile
對于requirements.txt的增強(qiáng),pipfile項(xiàng)目正處于活動(dòng)的設(shè)計(jì)和開發(fā)中,格式記錄在這里。將
ENABLE_PIPENV環(huán)境變量設(shè)置為true以處理此文件。 -
setup.py
配置項(xiàng)目的各個(gè)方面,包括安裝依賴項(xiàng),如此 處所述。對于大多數(shù)項(xiàng)目,只需使用
requirements.txt或Pipfile即可。將DISABLE_SETUP_PY_PROCESSING環(huán)境變量設(shè)置為true以跳過此文件的處理。
運(yùn)行策略
由s2i-python生成的容器鏡像按以下的優(yōu)先順序執(zhí)行項(xiàng)目:
-
Gunicorn
Gunicorn WSGI HTTP服務(wù)器用于在安裝時(shí)為您的應(yīng)用程序提供服務(wù)??梢酝ㄟ^將其列在
requirements.txt文件或文件setup.py的install_requires部分中來安裝它。如果
wsgi.py存儲庫中存在已命名的文件,則它將用作應(yīng)用程序的入口點(diǎn)。這可以用環(huán)境變量APP_MODULE覆蓋。默認(rèn)情況下,此文件存在于Django項(xiàng)目中。如果您的Django和Gunicorn都符合要求,您的Django項(xiàng)目將自動(dòng)使用Gunicorn。
-
Django開發(fā)服務(wù)器
如果您的Django符合要求但沒有Gunicorn,那么您的應(yīng)用程序?qū)⑹褂肈jango提供的開發(fā)Web服務(wù)器。但是,建議不要將其用于生產(chǎn)環(huán)境。
-
Python腳本
這將用于提供運(yùn)行應(yīng)用程序的Python代碼文件的位置。它將用于通過
APP_FILE環(huán)境變量指定Python腳本的路徑,默認(rèn)為app.py命名的文件(如果存在)。該腳本將傳遞給常規(guī)Python解釋器以啟動(dòng)您的應(yīng)用程序。 -
應(yīng)用腳本文件
這是執(zhí)行應(yīng)用程序的最常用方法。它將用于通過
APP_SCRIPT環(huán)境變量指定可執(zhí)行腳本文件的路徑,默認(rèn)為app.sh命名的文件(如果存在)。腳本直接執(zhí)行以啟動(dòng)您的應(yīng)用程序。
熱部署
熱部署允許您快速make和部署對應(yīng)用程序的更改,而無需生成新的S2I構(gòu)建。如果您使用Django,熱部署開箱即用。
要在使用Gunicorn時(shí)啟用熱部署,請確保在存儲庫中有一個(gè)Gunicorn配置文件, 其reload選項(xiàng)設(shè)置為true。使用APP_CONFIG環(huán)境變量指定配置文件 。例如,請參閱該oc new-app 命令。您可以使用該 oc set env 命令更新現(xiàn)有對象的環(huán)境變量。
:exclamation:
您應(yīng)該只在開發(fā)或調(diào)試時(shí)使用此選項(xiàng); 建議不要在生產(chǎn)環(huán)境中啟用此功能。
要在正在運(yùn)行的窗格中更改源代碼,請使用以下 oc rsh 命令輸入容器id:
$ oc rsh <pod_id>
進(jìn)入正在運(yùn)行的容器后,當(dāng)前目錄將設(shè)置為 /opt/app-root/src,源代碼位于此處。
也可以看看
可以在https://github.com/sclorg/s2i-python-container上找到Dockerfile和其他來源。在該存儲庫中,您還可以找到其他版本的Python環(huán)境Dockerfiles。CentOS的Dockerfile命名為Dockerfile,RHEL7的Dockerfile命名為Dockerfile.rhel7,RHEL8的命名為Dockerfile.rhel8。