Dockerfile masing -masingpython3.9 , latest (Dockerfile) Tag ini tidak lagi didukung atau dipelihara, mereka dihapus dari repositori GitHub, tetapi versi terakhir yang didorong mungkin masih tersedia di Docker Hub jika ada yang menariknya:
python3.9-alpine3.13python3.8python3.8-alpine3.11python3.7python3.7-alpine3.8python3.6python3.6-alpine3.8python2.7Tag tanggal terakhir untuk versi ini adalah:
python3.9-alpine3.13-2024-03-11python3.8-2024-10-28python3.8-alpine3.11-2024-03-11python3.7-2024-10-28python3.7-alpine3.8-2024-03-11python3.6-2022-11-25python3.6-alpine3.8-2022-11-25python2.7-2022-11-25 Catatan : Ada tag untuk setiap tanggal pembuatan. Jika Anda perlu "menyematkan" versi gambar Docker yang Anda gunakan, Anda dapat memilih salah satu tag tersebut. Misalnya tiangolo/meinheld-gunicorn-flask:python3.9-2024-11-02 .
Gambar Docker dengan Meinheld dikelola oleh Gunicorn untuk aplikasi web berkinerja tinggi di Flask menggunakan Python dengan kinerja auto-tuning.
Github Repo : https://github.com/tiangolo/meinheld-gunicorn-flask-docker
Gambar Hub Docker : https://hub.docker.com/r/tiangolo/meinheld-gunicorn-flask/
Aplikasi web Python Flask yang berjalan dengan Meinheld yang dikendalikan oleh Gunicorn memiliki beberapa kinerja terbaik yang dapat dicapai dengan Flask (*).
Jika Anda memiliki aplikasi yang sudah ada di Flask atau sedang membangun yang baru, gambar ini akan memberi Anda kinerja terbaik (atau dekat dengan itu).
Gambar ini memiliki mekanisme "penyetelan otomatis", sehingga Anda bisa menambahkan kode Anda dan mendapatkan kinerja yang baik secara otomatis. Dan tanpa membuat pengorbanan (seperti logging).
Versi terbaru yang dirilis Meinheld saat ini adalah 1.0.2, dari 17 Mei 2020. Versi Meinheld ini membutuhkan versi lama Greenlet ( >=0.4.5,<0.5 ) yang tidak kompatibel dengan Python 3.10 dan 3.11. Itulah mengapa versi terbaru Python yang didukung dalam gambar ini adalah Python 3.9.
Jika Anda memulai proyek baru, Anda mungkin mendapat manfaat dari kerangka kerja yang lebih baru dan lebih cepat seperti Fastapi (berdasarkan ASGI alih-alih WSGI seperti Flask dan Django), dan gambar Docker seperti Tiangolo/Uvicorn-Gunicorn-Fastapi .
Ini akan memberi Anda sekitar 200% kinerja yang dapat dicapai dengan Flask, bahkan saat menggunakan gambar ini.
Juga, jika Anda ingin menggunakan teknologi baru seperti WebSockets, itu akan lebih mudah dengan kerangka kerja yang lebih baru berdasarkan ASGI, seperti FastAPI . Karena standar ASGI dirancang untuk dapat menangani kode asinkron seperti yang dibutuhkan untuk websockets.
Meinheld adalah server web yang sesuai dengan kinerja tinggi WSGI.
Anda dapat menggunakan Gunicorn untuk mengelola Meinheld dan menjalankan beberapa prosesnya.
Flask adalah pekerjaan mikro untuk Python berdasarkan Werkzeug, Jinja 2 dan niat baik.
Gambar ini dibuat untuk menjadi alternatif untuk Tiangolo/UWSGI-NGINX-Flask , memberikan sekitar 400% kinerja gambar itu.
Ini didasarkan pada gambar yang lebih umum Tiangolo/Meinheld-Gunicorn . Itulah yang akan Anda gunakan untuk kerangka kerja WSGI lainnya, seperti Django.
Anda mungkin menggunakan kubernet atau alat serupa. Dalam hal ini, Anda mungkin tidak memerlukan gambar ini (atau gambar dasar serupa lainnya). Anda mungkin lebih baik membangun gambar Docker dari awal .
Jika Anda memiliki sekelompok mesin dengan Kubernetes , Docker Swarm Mode, NOMAD, atau sistem kompleks serupa lainnya untuk mengelola wadah terdistribusi pada beberapa mesin, maka Anda mungkin ingin menangani replikasi pada level cluster alih -alih menggunakan manajer proses di setiap wadah yang memulai beberapa proses pekerja , yang merupakan apa yang dilakukan oleh gambar Docker ini.
Dalam kasus tersebut (misalnya menggunakan Kubernetes) Anda mungkin ingin membangun gambar Docker dari awal , memasang dependensi Anda, dan menjalankan satu proses alih -alih gambar ini.
Misalnya, menggunakan Gunicorn Anda bisa memiliki app/gunicorn_conf.py dengan:
# Gunicorn config variables
loglevel = "info"
errorlog = "-" # stderr
accesslog = "-" # stdout
worker_tmp_dir = "/dev/shm"
graceful_timeout = 120
timeout = 120
keepalive = 5
threads = 3 Dan kemudian Anda bisa memiliki Dockerfile dengan:
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 [ "gunicorn" , "--conf" , "app/gunicorn_conf.py" , "--bind" , "0.0.0.0:80" , "app.main:app" ]Anda dapat membaca lebih lanjut tentang ide -ide ini dalam dokumentasi FASTAPI tentang: FASTAPI dalam wadah - Docker karena ide -ide yang sama akan berlaku untuk aplikasi web lain dalam wadah.
Anda dapat menginginkan manajer proses yang menjalankan beberapa proses pekerja dalam wadah jika aplikasi Anda cukup sederhana sehingga Anda tidak perlu (setidaknya belum) untuk menyempurnakan jumlah proses terlalu banyak, dan Anda bisa menggunakan default otomatis, dan Anda menjalankannya pada satu server , bukan cluster.
Anda bisa digunakan ke server tunggal (bukan cluster) dengan Docker Compose , jadi Anda tidak akan memiliki cara mudah untuk mengelola replikasi wadah (dengan Docker Compose) sambil melestarikan jaringan bersama dan menyeimbangkan beban .
Maka Anda ingin memiliki satu wadah dengan manajer proses yang memulai beberapa proses pekerja di dalamnya, seperti gambar Docker ini.
Anda juga dapat memiliki alasan lain yang akan membuatnya lebih mudah untuk memiliki satu wadah dengan beberapa proses daripada memiliki beberapa wadah dengan satu proses di masing -masing.
Misalnya (tergantung pada pengaturan Anda), Anda dapat memiliki beberapa alat seperti Exporter Prometheus di wadah yang sama yang seharusnya memiliki akses ke masing -masing permintaan yang datang.
Dalam hal ini, jika Anda memiliki banyak kontainer , secara default, ketika Prometheus datang untuk membaca metrik , itu akan mendapatkan yang untuk satu wadah setiap kali (untuk wadah yang menangani permintaan tertentu), alih -alih mendapatkan metrik yang terakumulasi untuk semua wadah yang direplikasi.
Kemudian, dalam hal ini, bisa lebih sederhana untuk memiliki satu wadah dengan banyak proses , dan alat lokal (misalnya eksportir Prometheus) pada wadah yang sama yang mengumpulkan metrik Prometheus untuk semua proses internal dan memaparkan metrik tersebut pada wadah tunggal itu.
Baca lebih lanjut tentang semuanya dalam dokumentasi FastAPI tentang: Fastapi dalam wadah - Docker, karena konsep yang sama berlaku untuk aplikasi web lain dalam wadah.
Anda tidak perlu mengkloning repo ini.
Anda dapat menggunakan gambar ini sebagai gambar dasar untuk gambar lain.
Dengan asumsi Anda memiliki file requirements.txt , Anda dapat memiliki Dockerfile seperti ini:
FROM tiangolo/meinheld-gunicorn-flask:python3.9
COPY ./requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY ./app /app Ini akan mengharapkan file di /app/app/main.py .
Atau file di /app/main.py .
Dan akan mengharapkannya berisi app variabel dengan aplikasi "WSGI" Anda.
Kemudian Anda dapat membangun gambar Anda dari direktori yang memiliki Dockerfile Anda, misalnya:
docker build -t myimage ./Ini adalah variabel lingkungan yang dapat Anda atur dalam wadah untuk mengonfigurasinya dan nilai defaultnya:
MODULE_NAME"Modul" Python (file) yang akan diimpor oleh Gunicorn, modul ini akan berisi aplikasi Flask yang sebenarnya dalam variabel.
Secara default:
app.main jika ada file /app/app/main.py ataumain jika ada file /app/main.py Misalnya, jika file utama Anda adalah di /app/custom_app/custom_main.py , Anda bisa mengaturnya seperti:
docker run -d -p 80:80 -e MODULE_NAME= " custom_app.custom_main " myimageVARIABLE_NAMEVariabel di dalam modul Python yang berisi aplikasi Flask.
Secara default:
appMisalnya, jika file Python utama Anda memiliki sesuatu seperti:
from flask import Flask
api = Flask ( __name__ )
@ api . route ( "/" )
def hello ():
return "Hello World from Flask" Dalam hal ini api akan menjadi variabel dengan "Aplikasi Flask". Anda bisa mengaturnya seperti:
docker run -d -p 80:80 -e VARIABLE_NAME= " api " myimageAPP_MODULEString dengan modul Python dan nama variabel diteruskan ke Gunicorn.
Secara default, setel berdasarkan variabel MODULE_NAME dan VARIABLE_NAME :
app.main:app ataumain:appAnda dapat mengaturnya seperti:
docker run -d -p 80:80 -e APP_MODULE= " custom_app.custom_main:api " myimageGUNICORN_CONFJalur ke file konfigurasi python gunicorn.
Secara default:
/app/gunicorn_conf.py jika ada/app/app/gunicorn_conf.py jika ada/gunicorn_conf.py (default yang disertakan)Anda dapat mengaturnya seperti:
docker run -d -p 80:80 -e GUNICORN_CONF= " /app/custom_gunicorn_conf.py " myimageWORKERS_PER_COREGambar ini akan memeriksa berapa banyak core CPU yang tersedia di server saat ini yang menjalankan wadah Anda.
Ini akan mengatur jumlah pekerja ke jumlah core CPU yang dikalikan dengan nilai ini.
Secara default:
2Anda dapat mengaturnya seperti:
docker run -d -p 80:80 -e WORKERS_PER_CORE= " 3 " myimage Jika Anda menggunakan nilai 3 di server dengan 2 core CPU, itu akan menjalankan 6 proses pekerja.
Anda dapat menggunakan nilai titik mengambang juga.
Jadi, misalnya, jika Anda memiliki server besar (katakanlah, dengan 8 core CPU) menjalankan beberapa aplikasi, dan Anda memiliki aplikasi ASGI yang Anda tahu tidak perlu kinerja tinggi. Dan Anda tidak ingin membuang sumber daya server. Anda bisa membuatnya menggunakan 0.5 pekerja per inti CPU. Misalnya:
docker run -d -p 80:80 -e WORKERS_PER_CORE= " 0.5 " myimageDi server dengan 8 core CPU, ini akan membuatnya hanya mulai 4 proses pekerja.
WEB_CONCURRENCYMengamati definisi otomatis jumlah pekerja.
Secara default:
WORKERS_PER_CORE . Jadi, di server dengan 2 core, secara default akan diatur ke 4 .Anda dapat mengaturnya seperti:
docker run -d -p 80:80 -e WEB_CONCURRENCY= " 2 " myimageIni akan membuat gambar memulai 2 proses pekerja, terlepas dari berapa banyak core CPU yang tersedia di server.
HOST"Tuan rumah" yang digunakan oleh Gunicorn, IP tempat Gunicorn akan mendengarkan permintaan.
Ini adalah tuan rumah di dalam wadah.
Jadi, misalnya, jika Anda mengatur variabel ini ke 127.0.0.1 , itu hanya akan tersedia di dalam wadah, bukan di host yang menjalankannya.
Ini disediakan untuk kelengkapan, tetapi Anda mungkin tidak boleh mengubahnya.
Secara default:
0.0.0.0PORTPort yang harus didengarkan wadah.
Jika Anda menjalankan wadah Anda di lingkungan terbatas yang memaksa Anda untuk menggunakan beberapa port tertentu (seperti 8080 ), Anda dapat mengaturnya dengan variabel ini.
Secara default:
80Anda dapat mengaturnya seperti:
docker run -d -p 80:8080 -e PORT= " 8080 " myimageBINDTuan rumah dan pelabuhan yang sebenarnya diteruskan ke Gunicorn.
Secara default, setel berdasarkan variabel HOST dan PORT .
Jadi, jika Anda tidak mengubah apa pun, itu akan ditetapkan secara default ke:
0.0.0.0:80Anda dapat mengaturnya seperti:
docker run -d -p 80:8080 -e BIND= " 0.0.0.0:8080 " myimageLOG_LEVELLevel log untuk Gunicorn.
Salah satu:
debuginfowarningerrorcritical Secara default, atur ke info .
Jika Anda perlu memeras lebih banyak penebangan berkorban kinerja, atur ke warning , misalnya:
Anda dapat mengaturnya seperti:
docker run -d -p 80:8080 -e LOG_LEVEL= " warning " myimage Log dikirim ke stderr dan stdout wadah, artinya Anda dapat melihat log dengan docker logs -f your_container_name_here perintah.
Gambar termasuk file konfigurasi python gunicorn default di /gunicorn_conf.py .
Ini menggunakan variabel lingkungan yang dinyatakan di atas untuk mengatur semua konfigurasi.
Anda dapat mengganti dengan memasukkan file di:
/app/gunicorn_conf.py/app/app/gunicorn_conf.py/gunicorn_conf.py/app/prestart.sh Jika Anda perlu menjalankan apa pun sebelum memulai aplikasi, Anda dapat menambahkan file prestart.sh ke direktori /app . Gambar akan secara otomatis mendeteksi dan menjalankannya sebelum memulai semuanya.
Misalnya, jika Anda ingin menambahkan migrasi Alembic SQL (dengan SQLalchemy), Anda dapat membuat file ./app/prestart.sh di direktori kode Anda (yang akan disalin oleh Dockerfile Anda) dengan:
#! /usr/bin/env bash
# Let the DB start
sleep 10 ;
# Run migrations
alembic upgrade head Dan itu akan menunggu 10 detik untuk memberikan database waktu untuk memulai dan kemudian menjalankan perintah alembic itu.
Jika Anda perlu menjalankan skrip python sebelum memulai aplikasi, Anda dapat membuat file /app/prestart.sh menjalankan skrip python Anda, dengan sesuatu seperti:
#! /usr/bin/env bash
# Run custom Python script before starting
python /app/my_custom_prestart_script.py Singkatnya: Anda mungkin tidak boleh menggunakan Alpine untuk proyek Python, alih -alih menggunakan versi gambar slim Docker.
Apakah Anda ingin detail lebih lanjut? Lanjutkan Membaca?
Alpine lebih berguna untuk bahasa lain di mana Anda membangun biner statis dalam satu tahap gambar Docker (menggunakan bangunan Docker multi-tahap) dan kemudian menyalinnya ke gambar Alpine sederhana, dan kemudian hanya menjalankan biner itu. Misalnya, menggunakan Go.
Tetapi untuk Python, karena Alpine tidak menggunakan perkakas standar yang digunakan untuk membangun ekstensi Python, saat memasang paket, dalam banyak kasus Python ( pip ) tidak akan menemukan paket yang dapat diinstal (roda ") untuk alpine. Dan setelah men -debug banyak kesalahan aneh, Anda akan menyadari bahwa Anda harus menginstal banyak alat tambahan dan membangun banyak ketergantungan hanya untuk menggunakan beberapa paket Python yang umum ini. ?
Ini berarti bahwa, meskipun gambar alpine asli mungkin kecil, Anda berakhir dengan gambar dengan ukuran yang sebanding dengan ukuran yang akan Anda dapatkan jika Anda baru saja menggunakan gambar Python standar (berdasarkan Debian), atau dalam beberapa kasus bahkan lebih besar. ?
Dan dalam semua kasus tersebut, akan membutuhkan waktu lebih lama untuk membangun, mengkonsumsi lebih banyak sumber daya, membangun ketergantungan lebih lama, dan juga meningkatkan jejak karbonnya, karena Anda menggunakan lebih banyak waktu dan energi CPU untuk setiap bangunan. ?
Jika Anda ingin gambar Python ramping, Anda harus mencoba dan menggunakan versi slim yang masih didasarkan pada Debian, tetapi lebih kecil. ?
Semua tag gambar, konfigurasi, variabel lingkungan dan opsi aplikasi diuji.
issue-manager.yml . PR #154 oleh @Tiangolo.latest-changes . PR #153 oleh @Tiangolo.latest-changes.yml . PR #141 oleh @alejsdev.README.md . PR #137 oleh @alejsdev. Sorotan rilis ini:
Dukungan untuk Python 3.9 dan 3.8.
DESHRECASI PYTHON 3.6 dan 2.7.
python3.6-2022-11-25 dan python2.7-2022-11-25 .Versi yang ditingkatkan dari semua dependensi.
Perbaikan dan perbaikan kecil.
Tambahkan dukungan untuk Python 3.9 dan Python 3.9 Alpine. PR #50 oleh @Tiangolo.
Tambahkan Python 3.8 dengan Alpine 3.11. PR #28.
Tambahkan dukungan untuk Python 3.8. PR #27.
tiangolo/meinheld-gunicorn-flask:python3.7-2019-10-15 . PR #17.Tambahkan dukungan untuk Python 2.7 (Anda harus menggunakan Python 3.7 atau Python 3.6). PR #11.
Perbarui Konfigurasi Travis CI. PR #10 oleh @cclauss.
/app/prestart.sh . Proyek ini dilisensikan berdasarkan ketentuan lisensi MIT.