此Docker圖像現在已棄用。無需使用它,您可以將Uvicorn與--workers一起使用。
在下面閱讀有關它的更多信息。
Dockerfile鏈接python3.11 , latest (Dockerfile)python3.10 , (Dockerfile)python3.9 , (Dockerfile)python3.11-slim (Dockerfile)python3.10-slim (Dockerfile)python3.9-slim (Dockerfile) 這些標籤不再受支持或維護,將它們從GitHub存儲庫中刪除,但是如果有人將其拉動,則可以在Docker Hub中推出的最後一個版本可以使用:
python3.8python3.8-slimpython3.7python3.9-alpine3.14python3.8-alpine3.10python3.7-alpine3.8python3.6python3.6-alpine3.8這些版本的最後日期標籤是:
python3.8-2024-11-02python3.8-slim-2024-11-02python3.7-2024-11-02python3.9-alpine3.14-2024-03-11python3.8-alpine3.10-2024-01-29python3.7-alpine3.8-2024-03-11python3.6-2022-11-25python3.6-alpine3.8-2022-11-25注意:每個構建日期都有標籤。如果您需要“固定”所使用的Docker Image版本,則可以選擇其中一個標籤。例如tiangolo/uvicorn-gunicorn-fastapi:python3.11-2024-11-02 。
由Gunicorn管理的Docker Image與gunicorn管理Python的高性能Fastapi Web應用程序,並具有性能自動調整。
github repo :https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker
Docker Hub圖像:https://hub.docker.com/r/tiangolo/uvicorn-gunicorn-fastapi/
Fastapi已證明是一個以第三方基準測量的最佳性能之一,這是一個最好的表演之一,這要歸功於Starlette並提供了驅動力。
可實現的性能與go and node.js框架相提並論。
該圖像具有一個自動調整機制,可以根據可用的CPU內核啟動許多工作過程。這樣一來,您就可以添加代碼並自動獲得高性能,這在簡單的部署中很有用。
您可能正在使用Kubernetes或類似工具。在這種情況下,您可能不需要此圖像(或任何其他類似的基本圖像)。如Fastapi在容器中的文檔中所解釋的那樣,您可能會從頭開始構建Docker映像- Docker:為Fastapi構建Docker映像。
如果您有一組帶有Kubernetes ,Docker Swarm模式,Nomad或其他類似複雜系統的機器,可以在多台機器上管理分佈式容器,那麼您可能希望在集群級別上處理複製,而不是使用Process Manager (例如每個容器中的uvicorn tockorn tocker tocker tocker table),這就是該docker映像的內容。
在這種情況下(例如使用kubernetes),您可能想從頭開始構建一個docker映像,安裝依賴項並運行單個Uvicorn進程而不是此圖像。
例如,您的Dockerfile看起來像:
FROM python:3.9
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD [ "uvicorn" , "app.main:app" , "--host" , "0.0.0.0" , "--port" , "80" ]您可以在FastAPI文檔中了解有關:Fastapi在容器中-Docker中的更多信息。
如果您肯定想在一個容器上有多個工人,Uvicorn現在支持處理子過程,包括重新啟動死亡。因此,槍手無需在一個容器中管理多個工人。
您可以從上方修改示例Dockerfile ,將--workers選項添加到Uvicorn,就像:
FROM python:3.9
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD [ "uvicorn" , "app.main:app" , "--host" , "0.0.0.0" , "--port" , "80" , "--workers" , "4" ]這就是您所需要的。您根本不需要此Docker圖像。 ?
您可以在Fastapi文檔中了解有關與Docker部署的更多信息。
Uvicorn不支持管理工人處理,包括重新啟動死去的工人。但是現在確實如此。
在此之前,槍支可以用作流程經理,經營Uvicorn工人。這種不再需要的增加的複雜性。
由於歷史原因,該文檔的其餘部分被保存下來,但您可能不需要它。 ?
tiangolo/uvicorn-gunicorn-fastapi該圖像將基於它正在運行的服務器(可用的CPU內核數量)設置明智的配置,而無需犧牲。
它具有明智的默認值,但是您可以使用環境變量進行配置或覆蓋配置文件。
也有苗條的版本。如果您想要其中之一,請使用上面的一個標籤。
tiangolo/uvicorn-gunicorn此圖像( tiangolo/uvicorn-gunicorn-fastapi )基於Tiangolo/Uvicorn-Gunicorn 。
該圖像實際上是所有工作。
此圖像只是安裝了FastApi,並在FastApi中具有專門針對的文檔。
如果您對自己對Uvicorn,Gunicorn和Asgi的了解充滿信心,則可以直接使用該圖像。
tiangolo/uvicorn-gunicorn-starlette有一個兄弟姐妹的圖像: tiangolo/uvicorn-gunicorn starlette
如果要創建一個新的星際網絡應用程序,並且要丟棄FastApi的所有其他功能,則應改用Tiangolo/Uvicorn-Gunicorn Starlette 。
注意:FastAPI基於星條,並在其頂部添加了幾個功能。對API和其他情況有用:數據驗證,數據轉換,帶有OpenAPI的文檔,依賴注入,安全/身份驗證等。
您不需要克隆github儲物庫。
您可以將此圖像用作其他圖像的基本圖像。
假設您有文件requirements.txt Dockerfile
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.11
COPY ./requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY ./app /app它將在/app/app/main.py上期望一個文件。
或以其他方式為/app/main.py 。
並期望它包含帶有您的FastAPI應用程序的可變app 。
然後,您可以從具有Dockerfile的目錄中構建圖像,例如:
docker build -t myimage ./Dockerfile FROM tiangolo/uvicorn-gunicorn-fastapi:python3.11
COPY ./requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY ./app /appapp程序目錄並輸入其中。main.py文件 from fastapi import FastAPI
app = FastAPI ()
@ app . get ( "/" )
def read_root ():
return { "Hello" : "World" }
@ app . get ( "/items/{item_id}" )
def read_item ( item_id : int , q : str = None ):
return { "item_id" : item_id , "q" : q } .
├── app
│ └── main.py
└── Dockerfile
Dockerfile所在的位置,包含您的app目錄)。docker build -t myimage .docker run -d --name mycontainer -p 80:80 myimage現在,您在Docker容器中擁有優化的FastApi服務器。自動調整當前服務器(以及CPU內核的數量)。
您應該能夠在Docker容器的URL中檢查它,例如:http://192.168.99.100/items/5?q= somequemequery或http://127.0.0.0.0.1/items/5?q= someMomequere(或使用您的Dockeker Hots)。
您會看到類似的東西:
{ "item_id" : 5 , "q" : " somequery " }現在,您可以訪問http://192.168.99.100/docs或http://127.0.0.1/docs(或使用docker主機)。
您將看到自動交互式API文檔(由Swagger UI提供):
而且,您也可以訪問http://192.168.99.100/redoc或http://127.0.0.0.1/redoc(或等價,使用您的Docker Host)。
您將看到替代自動文檔(由RETOC提供):
您可能還想添加應用程序的任何依賴項,並將其固定在特定版本中,可能包括Uvicorn,Gunicorn和Fastapi。
這樣,您可以確保您的應用程序始終按預期工作。
您可以使用requirements.txt ,甚至使用詩歌Dockerfile安裝帶有pip命令的軟件包。
然後,您可以以受控的方式升級這些依賴關係,運行測試,確保一切都起作用,但是如果某些新版本不兼容,則不破壞生產應用程序。
這是您可以安裝依賴項的方法之一,以確保每個軟件包都有固定版本。
假設您有一個詩歌管理的項目,因此,您在文件pyproject.toml中具有包裹依賴關係。可能是文件poetry.lock 。
然後,您可以使用Docker多階段建築物擁有一個Dockerfile 。
FROM python:3.9 as requirements-stage
WORKDIR /tmp
RUN pip install poetry
COPY ./pyproject.toml ./poetry.lock* /tmp/
RUN poetry export -f requirements.txt --output requirements.txt --without-hashes
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.11
COPY --from=requirements-stage /tmp/requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY ./app /app那將:
./poetry.lock* (以a *結尾),所以如果該文件尚未可用,它不會崩潰。安裝依賴項後複製應用程序代碼很重要,這樣您就可以利用Docker的緩存。這樣,只有在添加新的依賴項時,就不必每次更新應用程序文件時都要從頭開始安裝所有內容。
這也適用於您用於安裝依賴項的任何其他方式。如果您使用requirements.txt ,請單獨複製並安裝所有依賴項在Dockerfile的頂部,然後在其之後添加您的應用程序代碼。
這些是您可以在容器中設置的環境變量以配置它及其默認值:
MODULE_NAMEPython“模塊”(文件)將由Gunicorn導入,該模塊將在變量中包含實際應用程序。
默認情況下:
app.main如果有文件/app/app/main.py或main如果有文件/app/main.py例如,如果您的主文件位於/app/custom_app/custom_main.py ,則可以將其設置為:
docker run -d -p 80:80 -e MODULE_NAME= " custom_app.custom_main " myimageVARIABLE_NAME包含FastAPI應用程序的Python模塊內部的變量。
默認情況下:
app例如,如果您的主Python文件具有類似的內容:
from fastapi import FastAPI
api = FastAPI ()
@ api . get ( "/" )
def read_root ():
return { "Hello" : "World" }在這種情況下, api將是FastAPI應用程序的變量。您可以將其設置為:
docker run -d -p 80:80 -e VARIABLE_NAME= " api " myimageAPP_MODULE帶有Python模塊和變量名稱的字符串傳遞給Gunicorn。
默認情況下,基於變量MODULE_NAME和VARIABLE_NAME設置:
app.main:app或main:app您可以將其設置為:
docker run -d -p 80:80 -e APP_MODULE= " custom_app.custom_main:api " myimageGUNICORN_CONFGunicorn Python配置文件的路徑。
默認情況下:
/app/gunicorn_conf.py如果存在/app/app/gunicorn_conf.py如果存在/gunicorn_conf.py (隨附的默認值)您可以將其設置為:
docker run -d -p 80:80 -e GUNICORN_CONF= " /app/custom_gunicorn_conf.py " myimage您可以將基本圖像中的配置文件用作您的起點。
WORKERS_PER_CORE此圖像將檢查當前運行您的容器的當前服務器中有多少個CPU內核。
它將將工人數量設置為乘以該值的CPU內核數。
默認情況下:
1您可以將其設置為:
docker run -d -p 80:80 -e WORKERS_PER_CORE= " 3 " myimage如果您在具有2個CPU內核的服務器中使用了值3 ,則將運行6個工作過程。
您也可以使用浮點值。
因此,例如,如果您有一個運行多個應用程序的大服務器(例如,帶有8個CPU內核),並且您知道您知道的FastAPI應用程序不需要高性能。而且您不想浪費服務器資源。您可以每CPU核心使用0.5工人。例如:
docker run -d -p 80:80 -e WORKERS_PER_CORE= " 0.5 " myimage在具有8個CPU內核的服務器中,這將使它僅啟動4個工作過程。
注意:默認情況下,如果WORKERS_PER_CORE是1 ,並且服務器只有1個CPU核心,而不是啟動1個單個工作,它將啟動2個。這是為了避免性能不良,並且在小型機器上(服務器計算機/雲/等)上阻止了應用程序(服務器應用程序)。可以使用WEB_CONCURRENCY覆蓋這。
MAX_WORKERS設置最大使用的工人數量。
您可以使用它使圖像自動計算工人的數量,但要確保其最大限度地限於最大值。
例如,如果每個工人都使用數據庫連接,並且您的數據庫具有開放連接的最大限制,那麼這可能很有用。
默認情況下它不是設置的,這意味著它是無限的。
您可以將其設置為:
docker run -d -p 80:80 -e MAX_WORKERS= " 24 " myimage這將使圖像從大多數24名工人開始,而與服務器中有多少CPU可用。
WEB_CONCURRENCY覆蓋工人數量的自動定義。
默認情況下:
WORKERS_PER_CORE 。因此,在具有2個內核的服務器中,默認情況下它將設置為2 。您可以將其設置為:
docker run -d -p 80:80 -e WEB_CONCURRENCY= " 2 " myimage這將使圖像啟動2個工作過程,而與服務器中有多少個CPU內核無關。
HOSTGunicorn使用的“主機”,槍gunicorn將聆聽請求的IP。
它是容器內部的主機。
因此,例如,如果將此變量設置為127.0.0.1 ,則只能在容器內而不是在運行它的主機中可用。
它是為了完整性提供的,但您可能不應該更改它。
默認情況下:
0.0.0.0PORT容器應聆聽的端口。
如果您要在限制性環境中運行容器,該環境迫使您使用某些特定端口(例如8080 ),則可以使用此變量設置它。
默認情況下:
80您可以將其設置為:
docker run -d -p 80:8080 -e PORT= " 8080 " myimageBIND實際的主機和港口傳給了槍支。
默認情況下,基於變量HOST和PORT設置。
因此,如果您沒有更改任何內容,則默認情況下將設置為:
0.0.0.0:80您可以將其設置為:
docker run -d -p 80:8080 -e BIND= " 0.0.0.0:8080 " myimageLOG_LEVEL槍支的日誌級別。
之一:
debuginfowarningerrorcritical默認情況下,設置為info 。
如果您需要擠壓更多的性能犧牲記錄,請將其設置為warning ,例如:
您可以將其設置為:
docker run -d -p 80:8080 -e LOG_LEVEL= " warning " myimageWORKER_CLASS槍支將班級用於工人。
默認情況下,設置為uvicorn.workers.UvicornWorker 。
它使用Uvicorn的事實允許使用ASGI框架,例如FastApi,這也是提供最大性能的原因。
您可能不應該更改它。
但是,如果出於某種原因,您需要使用替代的Uvicorn Worker: uvicorn.workers.UvicornH11Worker ,您可以使用此環境變量進行設置。
您可以將其設置為:
docker run -d -p 80:8080 -e WORKER_CLASS= " uvicorn.workers.UvicornH11Worker " myimageTIMEOUT工人在這秒的時間裡沉默了很多秒,被殺死並重新開始。
在《槍支文檔:超時》中閱讀有關它的更多信息。
默認情況下,設置為120 。
請注意,像FastApi這樣的Uvicorn和Asgi框架是異步而不是同步的。因此,比同步工人更高的超時可能是安全的。
您可以將其設置為:
docker run -d -p 80:8080 -e TIMEOUT= " 20 " myimageKEEP_ALIVE等待在野生連接上的請求的秒數。
在《槍支文檔:keepalive》中閱讀更多有關它的信息。
默認情況下,設置為2 。
您可以將其設置為:
docker run -d -p 80:8080 -e KEEP_ALIVE= " 20 " myimageGRACEFUL_TIMEOUT優雅工人的超時重新啟動。
在《槍支文檔:優雅的超時》中閱讀更多有關它的信息。
默認情況下,設置為120 。
您可以將其設置為:
docker run -d -p 80:8080 -e GRACEFUL_TIMEOUT= " 20 " myimageACCESS_LOG要寫入的訪問日誌文件。
默認情況下"-" ,表示stdout(在Docker日誌中打印)。
如果要禁用ACCESS_LOG ,請將其設置為空值。
例如,您可以將其禁用:
docker run -d -p 80:8080 -e ACCESS_LOG= myimageERROR_LOG要寫入的錯誤日誌文件。
默認情況下"-" ,表示stderr(在Docker日誌中打印)。
如果要禁用ERROR_LOG ,請將其設置為空值。
例如,您可以將其禁用:
docker run -d -p 80:8080 -e ERROR_LOG= myimageGUNICORN_CMD_ARGS槍支的任何其他命令行設置都可以在GUNICORN_CMD_ARGS環境變量中傳遞。
在《槍支文檔:設置》中閱讀有關它的更多信息。
這些設置將優先於其他環境變量和任何Gunicorn配置文件。
例如,如果您有要使用的自定義TLS/SSL證書,則可以將其複製到Docker映像或將其安裝在容器中,然後將--keyfile和--certfile設置為文件位置,例如:
docker run -d -p 80:8080 -e GUNICORN_CMD_ARGS= " --keyfile=/secrets/key.pem --certfile=/secrets/cert.pem " -e PORT=443 myimage注意:代替自己處理TLS/SSL並在容器中配置它,而是建議使用像Traefik這樣的“ TLS終止代理”。您可以在有關HTTPS的FastAPI文檔中閱讀有關它的更多信息。
PRE_START_PATH找到啟動腳本的路徑。
默認情況下,設置為/app/prestart.sh 。
您可以將其設置為:
docker run -d -p 80:8080 -e PRE_START_PATH= " /custom/script.sh " myimage該圖像在/gunicorn_conf.py上包括一個默認的Gunicorn Python配置文件。
它使用上面聲明的環境變量來設置所有配置。
您可以通過在:
/app/gunicorn_conf.py/app/app/gunicorn_conf.py/gunicorn_conf.py/app/prestart.sh如果您需要在啟動應用程序之前運行任何內容,則可以將文件prestart.sh添加到目錄/app 。圖像將在開始所有內容之前自動檢測並運行它。
例如,如果要添加ALEMBIC SQL遷移(使用SQLalchemy),則可以在代碼目錄中創建一個./app/prestart.sh文件(由您的Dockerfile複製)中:
#! /usr/bin/env bash
# Let the DB start
sleep 10 ;
# Run migrations
alembic upgrade head它將等待10秒鐘才能給數據庫一些時間開始,然後運行該alembic命令。
如果您需要在啟動應用程序之前運行Python腳本,則可以使/app/prestart.sh文件運行您的python腳本,並帶有類似的內容:
#! /usr/bin/env bash
# Run custom Python script before starting
python /app/my_custom_prestart_script.py您可以使用上面描述的環境變量PRE_START_PATH自定義Prestart腳本的位置。
運行的默認程序在/start.sh 。它可以完成上面描述的所有內容。
還有一個用於開發的版本,其中有實時自動加載量:
/start-reload.sh為了開發,能夠將應用程序代碼的內容安裝在容器中的“主機捲”中,能夠更改代碼和測試其實時,而無需每次構建圖像。
在這種情況下,使用Live Auto-Reload運行服務器也很有用,以便在每個代碼更改時自動重新啟動。
附加的腳本/start-reload.sh僅在一個過程中單獨運行UVICORN(沒有槍支)。
它是開發的理想選擇。
例如,而不是運行:
docker run -d -p 80:80 myimage您可以運行:
docker run -d -p 80:80 -v $( pwd ) :/app myimage /start-reload.sh-v $(pwd):/app :表示目錄$(pwd)應安裝為AT /app容器內部的音量。$(pwd) :運行pwd (“打印工作目錄”),並將其作為字符串的一部分。/start-reload.sh :在命令末尾添加一些東西(例如/start-reload.sh ),用此替換默認的“命令”。在這種情況下,它用開發替代/start-reload.sh代替默認值( /start.sh )。 AS /start-reload.sh不使用Gunicorn運行,您將任何配置都放在gunicorn_conf.py文件中。
但是這些環境變量的工作原理與上述相同:
MODULE_NAMEVARIABLE_NAMEAPP_MODULEHOSTPORTLOG_LEVEL簡而言之:您可能不應該將高山用於Python項目,而是使用slim Docker Image版本。
您想要更多詳細信息嗎?繼續閱讀?
Alpine對於您在一個Docker Image階段(使用多階段Docker Building)然後將其複製到簡單的Alpine圖像,然後執行該二進製文件的其他語言更有用。例如,使用GO。
但是對於Python而言,由於Alpine不使用用於構建Python擴展的標準工具,因此在安裝軟件包時,在許多情況下,Python( pip )找不到Alpine的預編譯可安裝的軟件包(“ Wheel”)。在調試許多奇怪的錯誤之後,您將意識到,您必須安裝許多額外的工具並構建許多依賴關係,以便使用其中一些常見的Python軟件包。 ?
這意味著,儘管原始的高山圖像可能很小,但您最終會得到一個尺寸的圖像,如果您剛剛使用了標準的Python圖像(基於Debian),或者在某些情況下更大。 ?
在所有這些情況下,構建需要更長的時間,消耗更多的資源,建立更長的依賴性,並增加其碳足跡,因為您在每個構建中都使用了更多的CPU時間和能量。 ?
如果您想要Slim Python圖像,則應嘗試使用仍然基於Debian但較小的slim版本。 ?
測試了所有圖像標籤,配置,環境變量和應用程序選項。
--workers一起使用。 @tiangolo的PR#303。issue-manager.yml 。 @tiangolo的PR#343。latest-changes github動作。 @tiangolo的PR#340。latest-changes.yml 。 PR#276由@Alejsdev。README.md中的測試徽章。 PR#275由@Alejsdev。README.md中的測試徽章。 PR#274 @alejsdev。 此版本的亮點:
python3.6-2022-11-25 。slim版本。 PR#40。WORKER_CLASSTIMEOUTKEEP_ALIVEGRACEFUL_TIMEOUTACCESS_LOGERROR_LOGGUNICORN_CMD_ARGSMAX_WORKERSPRE_START_PATH env v var的文檔。 PR#33。tiangolo/uvicorn-gunicorn-fastapi:python3.7-2019-10-15 。 PR#17。/start-reload.sh添加對實時自動填充的支持,請檢查更新的文檔。 PR#6在父映像中。WORKERS_PER_CORE設置為默認為1 ,因為它表明在基准上具有最佳性能。WEB_CONCURRENCY時,將默認的Web並發設置為至少2個工人。這是為了避免性能不佳,並阻止了小型機器(服務器機/雲/等)上的應用程序(服務器應用程序)。可以使用WEB_CONCURRENCY覆蓋這。例如,在設置為1 (默認值)的WORKERS_PER_CORE ,並且服務器僅具有1個CPU核心的情況下,這適用於此。 PR#6和PR#5在父映像中。/start.sh獨立運行,讀取和生成使用的默認環境變量。並刪除/entrypoint.sh因為它不會修改系統中的任何內容,因此只讀取環境變量。 PR#4在父映像中。/app/prestart.sh的支持。 該項目是根據MIT許可證的條款獲得許可的。