ตอนนี้ภาพนักเทียบท่านี้เลิกใช้แล้ว ไม่จำเป็นต้องใช้มันคุณสามารถใช้ 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 ที่คุณใช้คุณสามารถเลือกหนึ่งในแท็กเหล่านั้น เช่น tiangolo/uvicorn-gunicorn-fastapi:python3.11-2024-11-02
Docker Image กับ Uvicorn ที่จัดการโดย Gunicorn สำหรับแอพพลิเคชั่นเว็บ Fastapi ที่มีประสิทธิภาพสูงใน Python พร้อมการปรับแต่งอัตโนมัติ
GitHub repo : https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker
Docker Hub Image : https://hub.docker.com/r/tiangolo/uvicorn-gunicorn-fastapi/
Fastapi ได้แสดงให้เห็นว่าเป็นเฟรมเวิร์กเว็บ Python ที่มีการแสดงที่ดีที่สุดอย่างหนึ่งซึ่งวัดได้จากเกณฑ์มาตรฐานของบุคคลที่สามเนื่องจากมีพื้นฐานมาจากและขับเคลื่อนโดย Starlette
ประสิทธิภาพที่ทำได้นั้นเทียบกับ (และในหลาย ๆ กรณีที่เหนือกว่า) GO และ Node.js Frameworks
ภาพนี้มีกลไกการ ปรับจูนอัตโนมัติ เพื่อเริ่มกระบวนการของคนงานจำนวนหนึ่งตามแกน CPU ที่มีอยู่ ด้วยวิธีนี้คุณสามารถเพิ่มรหัสของคุณและรับ ประสิทธิภาพสูง โดยอัตโนมัติซึ่งมีประโยชน์ใน การปรับใช้อย่างง่าย
คุณอาจใช้ Kubernetes หรือเครื่องมือที่คล้ายกัน ในกรณีนี้คุณอาจ ไม่ต้องการภาพนี้ (หรือ ภาพฐานอื่น ๆ ที่คล้ายกัน ) คุณน่าจะดีกว่า ในการสร้างอิมเมจนักเทียบท่าตั้งแต่เริ่มต้น ตามที่อธิบายไว้ในเอกสารสำหรับ Fastapi ในคอนเทนเนอร์ - Docker: สร้างภาพนักเทียบท่าสำหรับ Fastapi
หากคุณมีกลุ่มเครื่องจักรที่มี Kubernetes , Docker Swarm Mode, Nomad หรือระบบที่ซับซ้อนอื่น ๆ ที่คล้ายกันเพื่อจัดการภาชนะกระจายในเครื่องหลายเครื่องคุณอาจต้องการ จัดการการจำลองแบบ ใน ระดับคลัสเตอร์ แทนที่จะใช้ ตัวจัดการกระบวนการ
ในกรณีเหล่านั้น (เช่นการใช้ Kubernetes) คุณอาจต้องการสร้าง อิมเมจนักเทียบท่าตั้งแต่เริ่มต้น การติดตั้งการพึ่งพาของคุณและเรียกใช้ กระบวนการ 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 รองรับการจัดการกระบวนการย่อยรวมถึงการรีสตาร์ทคนตาย ดังนั้นจึงไม่จำเป็นต้องให้ Gunicorn จัดการคนงานหลายคนในภาชนะเดียว
คุณสามารถแก้ไขตัวอย่าง 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" ]นั่นคือทั้งหมดที่คุณต้องการ คุณไม่ต้องการภาพนักเทียบท่านี้เลย -
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ในเอกสาร Fastapi เกี่ยวกับการปรับใช้กับ Docker
Uvicorn ไม่สนับสนุนการจัดการการประมวลผลคนงานรวมถึงการรีสตาร์ทคนงานที่ตายแล้ว แต่ตอนนี้มันทำ
ก่อนหน้านั้น Gunicorn สามารถใช้เป็นผู้จัดการกระบวนการโดยใช้คนงาน 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
หากคุณกำลังสร้างแอปพลิเคชันเว็บ Starlette ใหม่และคุณต้องการยกเลิกคุณสมบัติเพิ่มเติมทั้งหมดจาก Fastapi คุณควรใช้ Tiangolo/Uvicorn-Gunicorn-Starlette แทน
หมายเหตุ : Fastapi ขึ้นอยู่กับ Starlette และเพิ่มคุณสมบัติหลายอย่างที่ด้านบนของมัน มีประโยชน์สำหรับ APIs และกรณีอื่น ๆ : การตรวจสอบข้อมูลการแปลงข้อมูลเอกสารด้วย OpenAPI การฉีดพึ่งพาการรักษาความปลอดภัย/การตรวจสอบและอื่น ๆ
คุณไม่จำเป็นต้องโคลน GitHub Repo
คุณสามารถใช้ภาพนี้เป็นภาพพื้นฐานสำหรับภาพอื่น ๆ
สมมติว่าคุณมี requirements.txt ไฟล์ 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
หรือมิฉะนั้นไฟล์ at /app/main.py
และคาดว่าจะมี app ตัวแปรด้วยแอปพลิเคชัน Fastapi ของคุณ
จากนั้นคุณสามารถสร้างภาพของคุณจากไดเรกทอรีที่มี 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ตอนนี้คุณมีเซิร์ฟเวอร์ fastapi ที่ปรับให้เหมาะสมในคอนเทนเนอร์ Docker ปรับอัตโนมัติสำหรับเซิร์ฟเวอร์ปัจจุบันของคุณ (และจำนวนแกน CPU)
คุณควรจะสามารถตรวจสอบได้ใน URL ของคอนเทนเนอร์ Docker ของคุณตัวอย่างเช่น: http://192.168.99.100/items/5?q= someQuery หรือ http://127.0.0.1/items/5?Q=
คุณจะเห็นบางอย่างเช่น:
{ "item_id" : 5 , "q" : " somequery " }ตอนนี้คุณสามารถไปที่ http://192.168.99.100/docs หรือ http://127.0.0.1/docs (หรือเทียบเท่าโดยใช้โฮสต์นักเทียบท่าของคุณ)
คุณจะเห็นเอกสาร API แบบโต้ตอบอัตโนมัติ (จัดทำโดย Swagger UI):
และคุณยังสามารถไปที่ http://192.168.99.100/redoc หรือ http://127.0.0.1/redoc(or เทียบเท่าโดยใช้โฮสต์นักเทียบท่าของคุณ)
คุณจะเห็นเอกสารอัตโนมัติทางเลือก (จัดทำโดย redoc):
คุณอาจต้องการเพิ่มการอ้างอิงใด ๆ สำหรับแอปของคุณและตรึงไว้ในเวอร์ชันเฉพาะอาจรวมถึง Uvicorn, Gunicorn และ Fastapi
วิธีนี้คุณสามารถตรวจสอบให้แน่ใจว่าแอปของคุณใช้งานได้เสมอตามที่คาดไว้
คุณสามารถติดตั้งแพ็คเกจที่มีคำสั่ง pip ใน Dockerfile ของคุณโดยใช้ requirements.txt หรือแม้กระทั่งการใช้บทกวี
จากนั้นคุณสามารถอัพเกรดการพึ่งพาเหล่านั้นด้วยวิธีการควบคุมเรียกใช้การทดสอบของคุณตรวจสอบให้แน่ใจว่าทุกอย่างใช้งานได้ แต่ไม่ได้ทำลายแอปพลิเคชันการผลิตของคุณหากเวอร์ชันใหม่เข้ากันไม่ได้
นี่คือตัวอย่างเล็ก ๆ ของวิธีที่คุณสามารถติดตั้งการพึ่งพาของคุณได้เพื่อให้แน่ใจว่าคุณมีเวอร์ชันที่ตรึงไว้สำหรับแต่ละแพ็คเกจ
สมมติว่าคุณมีโครงการที่จัดการด้วยบทกวีดังนั้นคุณมีการพึ่งพาแพ็คเกจของคุณในไฟล์ pyproject.toml และอาจเป็น poetry.lock ไฟล์ล็อค
จากนั้นคุณสามารถมี Dockerfile โดยใช้อาคารหลายขั้นตอน Docker ด้วย:
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* (ลงท้ายด้วย * ) จึงไม่ผิดพลาดหากไฟล์นั้นยังไม่พร้อมใช้งานสิ่งสำคัญคือการคัดลอกรหัสแอพ หลังจาก ติดตั้งการพึ่งพาวิธีที่คุณสามารถใช้ประโยชน์จากแคชของ 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ตัวแปรภายในโมดูล Python ที่มีแอปพลิเคชัน fastapi
โดยค่าเริ่มต้น:
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_CONFพา ธ ไปยังไฟล์กำหนดค่า Gunicorn 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 หากคุณใช้ค่า 3 ในเซิร์ฟเวอร์ที่มี 2 CPU Cores มันจะเรียกใช้ 6 กระบวนการของคนงาน
คุณสามารถใช้ค่าจุดลอยตัวได้เช่นกัน
ตัวอย่างเช่นหากคุณมีเซิร์ฟเวอร์ขนาดใหญ่ (สมมติว่ามี 8 คอร์ซีพียู) ที่ใช้งานแอปพลิเคชันหลายอย่างและคุณมีแอปพลิเคชัน Fastapi ที่คุณรู้ว่าไม่จำเป็นต้องมีประสิทธิภาพสูง และคุณไม่ต้องการเสียทรัพยากรเซิร์ฟเวอร์ คุณสามารถใช้งานได้ 0.5 คนต่อ CPU Core ตัวอย่างเช่น:
docker run -d -p 80:80 -e WORKERS_PER_CORE= " 0.5 " myimageในเซิร์ฟเวอร์ที่มี 8 คอร์ CPU ซึ่งจะทำให้เริ่มต้นกระบวนการของคนงานเพียง 4 กระบวนการเท่านั้น
หมายเหตุ : โดยค่าเริ่มต้นหาก WORKERS_PER_CORE คือ 1 และเซิร์ฟเวอร์มี CPU Core เพียง 1 ตัวแทนที่จะเริ่มต้น 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 ที่มีอยู่ในเซิร์ฟเวอร์
HOST"โฮสต์" ที่ใช้โดย Gunicorn, IP ที่ Gunicorn จะฟังคำขอ
มันเป็นโฮสต์ภายในคอนเทนเนอร์
ตัวอย่างเช่นหากคุณตั้งค่าตัวแปรนี้เป็น 127.0.0.1 มันจะสามารถใช้ได้ภายในคอนเทนเนอร์เท่านั้นไม่ใช่ในโฮสต์ที่ทำงาน
มันมีไว้เพื่อความสมบูรณ์ แต่คุณอาจไม่ควรเปลี่ยนแปลง
โดยค่าเริ่มต้น:
0.0.0.0PORTพอร์ตคอนเทนเนอร์ควรฟัง
หากคุณใช้งานคอนเทนเนอร์ในสภาพแวดล้อมที่ จำกัด ซึ่งบังคับให้คุณใช้พอร์ตเฉพาะ (เช่น 8080 ) คุณสามารถตั้งค่าด้วยตัวแปรนี้
โดยค่าเริ่มต้น:
80คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:8080 -e PORT= " 8080 " myimageBINDโฮสต์ที่แท้จริงและพอร์ตผ่านไปยัง Gunicorn
โดยค่าเริ่มต้นตั้งค่าตาม HOST และ PORT
ดังนั้นหากคุณไม่ได้เปลี่ยนแปลงอะไรเลยมันจะถูกตั้งค่าตามค่าเริ่มต้นเป็น:
0.0.0.0:80คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:8080 -e BIND= " 0.0.0.0:8080 " myimageLOG_LEVELระดับบันทึกสำหรับ Gunicorn
หนึ่งใน:
debuginfowarningerrorcritical โดยค่าเริ่มต้นตั้งค่าเป็น info
หากคุณต้องการบีบการเสียสละประสิทธิภาพให้มากขึ้นให้ตั้งค่าเป็น warning ตัวอย่างเช่น:
คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:8080 -e LOG_LEVEL= " warning " myimageWORKER_CLASSชั้นเรียนที่ Gunicorn ใช้สำหรับคนงาน
โดยค่าเริ่มต้นตั้งค่าเป็น uvicorn.workers.UvicornWorker
ความจริงที่ว่ามันใช้ Uvicorn เป็นสิ่งที่อนุญาตให้ใช้เฟรมเวิร์ก ASGI เช่น Fastapi และนั่นคือสิ่งที่ให้ประสิทธิภาพสูงสุด
คุณอาจไม่ควรเปลี่ยนแปลง
แต่ถ้าด้วยเหตุผลบางอย่างคุณต้องใช้คนงาน Uvicorn ทางเลือก: uvicorn.workers.UvicornH11Worker คุณสามารถตั้งค่าด้วยตัวแปรสภาพแวดล้อมนี้
คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:8080 -e WORKER_CLASS= " uvicorn.workers.UvicornH11Worker " myimageTIMEOUTคนงานเงียบกว่าหลายวินาทีนี้ถูกฆ่าและเริ่มต้นใหม่
อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ในเอกสาร Gunicorn: หมดเวลา
โดยค่าเริ่มต้นตั้งค่าเป็น 120
ขอให้สังเกตว่าเฟรมเวิร์ก Uvicorn และ ASGI เช่น Fastapi เป็น Async ไม่ใช่การซิงค์ ดังนั้นจึงอาจปลอดภัยที่จะมีการหมดเวลาสูงกว่าสำหรับคนงานซิงค์
คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:8080 -e TIMEOUT= " 20 " myimageKEEP_ALIVEจำนวนวินาทีที่จะรอคำขอในการเชื่อมต่อแบบค้ำจุน
อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ในเอกสาร Gunicorn: Keepalive
โดยค่าเริ่มต้นตั้งค่าเป็น 2
คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:8080 -e KEEP_ALIVE= " 20 " myimageGRACEFUL_TIMEOUTหมดเวลาสำหรับคนงานที่สง่างามรีสตาร์ท
อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ในเอกสาร Gunicorn: 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 สามารถส่งผ่านในตัวแปรสภาพแวดล้อม GUNICORN_CMD_ARGS
อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ในเอกสาร Gunicorn: การตั้งค่า
การตั้งค่าเหล่านี้จะมีความสำคัญเหนือกว่าตัวแปรสภาพแวดล้อมอื่น ๆ และไฟล์กำหนดค่า Gunicorn ใด ๆ
ตัวอย่างเช่นหากคุณมีใบรับรอง TLS/SSL แบบกำหนดเองที่คุณต้องการใช้คุณสามารถคัดลอกไปยัง Image 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 ด้วยตัวเองและกำหนดค่าไว้ในคอนเทนเนอร์ขอแนะนำให้ใช้ "พร็อกซีการเลิกจ้าง TLS" เช่น Traefik คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ในเอกสาร Fastapi เกี่ยวกับ HTTPS
PRE_START_PATHเส้นทางที่จะค้นหาสคริปต์ก่อนเริ่ม
โดยค่าเริ่มต้นตั้งค่าเป็น /app/prestart.sh
คุณสามารถตั้งค่าได้เช่น:
docker run -d -p 80:8080 -e PRE_START_PATH= " /custom/script.sh " myimage ภาพรวมไฟล์กำหนดค่า Gunicorn Python เริ่มต้นที่ /gunicorn_conf.py
มันใช้ตัวแปรสภาพแวดล้อมที่ประกาศไว้ข้างต้นเพื่อตั้งค่าการกำหนดค่าทั้งหมด
คุณสามารถแทนที่ด้วยไฟล์ใน:
/app/gunicorn_conf.py/app/app/gunicorn_conf.py/gunicorn_conf.py/app/prestart.sh หากคุณต้องการเรียกใช้อะไรก่อนเริ่มแอปคุณสามารถเพิ่มไฟล์ prestart.sh ในไดเรกทอรี /app ภาพจะตรวจจับและเรียกใช้โดยอัตโนมัติก่อนเริ่มทุกอย่าง
ตัวอย่างเช่นหากคุณต้องการเพิ่ม Alembic SQL Migrations (ด้วย 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 คุณสามารถปรับแต่งตำแหน่งของสคริปต์ Prestart ด้วยตัวแปรสภาพแวดล้อม PRE_START_PATH ที่อธิบายไว้ข้างต้น
โปรแกรมเริ่มต้นที่เรียกใช้คือ At /start.sh มันทำทุกอย่างที่อธิบายไว้ข้างต้น
นอกจากนี้ยังมีเวอร์ชันสำหรับการพัฒนาด้วยการโหลดสดอัตโนมัติที่:
/start-reload.shสำหรับการพัฒนามันมีประโยชน์ที่จะสามารถติดตั้งเนื้อหาของรหัสแอปพลิเคชันภายในคอนเทนเนอร์เป็นนักเทียบท่า "ปริมาณโฮสต์" เพื่อให้สามารถเปลี่ยนรหัสและทดสอบการใช้งานได้โดยไม่ต้องสร้างภาพทุกครั้ง
ในกรณีนี้มันยังมีประโยชน์ในการเรียกใช้เซิร์ฟเวอร์ด้วยการโหลดอัตโนมัติสดเพื่อให้เริ่มต้นใหม่โดยอัตโนมัติทุกการเปลี่ยนแปลงรหัส
สคริปต์เพิ่มเติม /start-reload.sh เรียกใช้ uvicorn เพียงอย่างเดียว (ไม่มี gunicorn) และในกระบวนการเดียว
เหมาะอย่างยิ่งสำหรับการพัฒนา
ตัวอย่างเช่นแทนที่จะทำงาน:
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.sh ) ด้วยทางเลือกการพัฒนา /start-reload.sh AS /start-reload.sh ไม่ได้ทำงานกับ Gunicorn การกำหนดค่าใด ๆ ที่คุณใส่ในไฟล์ gunicorn_conf.py จะไม่นำมาใช้
แต่ตัวแปรสภาพแวดล้อมเหล่านี้จะทำงานเช่นเดียวกับที่อธิบายไว้ข้างต้น:
MODULE_NAMEVARIABLE_NAMEAPP_MODULEHOSTPORTLOG_LEVEL กล่าวโดยย่อ: คุณอาจไม่ควรใช้อัลไพน์สำหรับโครงการ Python แทนที่จะใช้เวอร์ชันอิมเมจ Docker slim
คุณต้องการรายละเอียดเพิ่มเติมหรือไม่? อ่านต่อ?
อัลไพน์มีประโยชน์มากกว่าสำหรับภาษาอื่น ๆ ที่คุณสร้างไบนารีแบบคงที่ในเวทีภาพนักเทียบท่าหนึ่ง (ใช้การสร้างท่าเทียบเรือหลายขั้นตอน) จากนั้นคัดลอกไปยังภาพอัลไพน์ที่เรียบง่ายแล้วดำเนินการไบนารีนั้น ตัวอย่างเช่นการใช้ไป
แต่สำหรับ Python เนื่องจากอัลไพน์ไม่ได้ใช้เครื่องมือมาตรฐานที่ใช้ในการสร้างส่วนขยาย Python เมื่อติดตั้งแพ็คเกจในหลายกรณี Python ( pip ) จะไม่พบแพ็คเกจที่ติดตั้งได้แบบ preompiled ("ล้อ") สำหรับอัลไพน์ และหลังจากการดีบักข้อผิดพลาดแปลก ๆ มากมายคุณจะรู้ว่าคุณต้องติดตั้งเครื่องมือพิเศษจำนวนมากและสร้างการพึ่งพาจำนวนมากเพื่อใช้แพ็คเกจ Python ทั่วไปเหล่านี้ -
ซึ่งหมายความว่าแม้ว่าภาพอัลไพน์ดั้งเดิมอาจมีขนาดเล็ก แต่คุณก็จบลงด้วยภาพที่มีขนาดเทียบได้กับขนาดที่คุณจะได้รับหากคุณเพิ่งใช้ภาพงูหลามมาตรฐาน (อิงตาม Debian) หรือในบางกรณี -
และในทุกกรณีมันจะใช้เวลานานกว่าในการสร้างใช้ทรัพยากรมากขึ้นการสร้างการพึ่งพานานขึ้นและยังเพิ่มการปล่อยก๊าซคาร์บอนไดออกไซด์ในขณะที่คุณใช้เวลาและพลังงานของซีพียูมากขึ้นสำหรับการสร้างแต่ละครั้ง -
หากคุณต้องการรูปภาพ Python ที่เพรียวบางคุณควรลองและใช้เวอร์ชัน slim ที่ยังคงใช้ Debian แต่มีขนาดเล็กลง -
แท็กรูปภาพทั้งหมดการกำหนดค่าตัวแปรสภาพแวดล้อมและตัวเลือกแอปพลิเคชันได้รับการทดสอบ
--workers PR #303 โดย @tiangoloissue-manager.yml PR #343 โดย @tiangololatest-changes ของ GitHub PR #340 โดย @tiangololatest-changes.yml PR #276 โดย @alejsdevREADME.md PR #275 โดย @alejsdevREADME.md PR #274 โดย @alejsdev ไฮไลท์ของรุ่นนี้:
python3.6-2022-11-25slim PR #40WORKER_CLASSTIMEOUTKEEP_ALIVEGRACEFUL_TIMEOUTACCESS_LOGERROR_LOGGUNICORN_CMD_ARGSMAX_WORKERSPRE_START_PATH env var PR #33tiangolo/uvicorn-gunicorn-fastapi:python3.7-2019-10-15 PR #17./start-reload.sh ตรวจสอบเอกสารที่อัปเดต PR #6 ในภาพแม่WORKERS_PER_CORE โดยค่าเริ่มต้นเป็น 1 เนื่องจากแสดงให้เห็นว่ามีประสิทธิภาพที่ดีที่สุดในการเปรียบเทียบWEB_CONCURRENCY เป็นอย่างน้อย 2 คน นี่คือการหลีกเลี่ยงประสิทธิภาพที่ไม่ดีและการปิดกั้นแอปพลิเคชัน (แอปพลิเคชันเซิร์ฟเวอร์) บนเครื่องจักรขนาดเล็ก (Server Machine/Cloud/etc) สิ่งนี้สามารถแทนที่ได้โดยใช้ WEB_CONCURRENCY สิ่งนี้ใช้ตัวอย่างเช่นในกรณีที่ WORKERS_PER_CORE ตั้งค่าเป็น 1 (ค่าเริ่มต้น) และเซิร์ฟเวอร์มีเพียง 1 CPU core PR #6 และ PR #5 ในภาพแม่/start.sh เรียกใช้อย่างอิสระอ่านและสร้างตัวแปรสภาพแวดล้อมเริ่มต้นที่ใช้ และลบ /entrypoint.sh เนื่องจากไม่ได้แก้ไขอะไรในระบบเพียงอ่านตัวแปรสภาพแวดล้อมเท่านั้น PR #4 ในภาพแม่/app/prestart.sh โครงการนี้ได้รับใบอนุญาตภายใต้ข้อกำหนดของใบอนุญาต MIT