Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyahpepijat aplikasi Python dan Django di dalam bekas Docker

Bagaimana untuk menyahpepijat aplikasi Python dan Django di dalam bekas Docker

王林
王林asal
2024-08-06 20:21:10952semak imbas

How to debug a Python and Django application inside a Docker container

rollercoaster emosi yang dialami semasa membangunkan sistem adalah sesuatu yang boleh nyatakan dengan jelas oleh sesiapa yang mempunyai pendedahan yang minimum kepada perkara ini. Walau bagaimanapun, bagi mereka yang mempunyai pengalaman penting dalam pelbagai projek dan aplikasi, membina sistem dari awal sering dianggap sebagai situasi impian.

Mimpi ngeri sebenar timbul apabila anda perlu mengekalkan, menyokong atau mengembangkan sistem sedia ada dan sedang berjalan - kadangkala dengan beribu-ribu atau berjuta-juta pengguna. Dan lapisan paling dalam The Inferno of Dante dalam pembangunan perisian ialah apabila anda perlu nyahpepijat kod untuk menyelesaikan isu.

Saya tahu bahawa kadangkala, terutamanya apabila anda baru bermula, anda bergantung pada cetakan() yang paling mudah dan paling tidak formal serta setara dengannya dalam bahasa lain. Jangan risau, rahsia kami selamat di sini. Walau bagaimanapun, kami juga tahu bahawa untuk pepijat yang paling menyakitkan dan rumit, kami perlu menggunakan alat nyahpepijat yang cekap, berkuasa dan komprehensif.

Saya telah dikehendaki menganalisis beberapa isu prestasi dalam kerja saya. Siasatan cetek tentang pengembalian fungsi/kelas atau penjejakan masa dengan Grafana tidak mencukupi untuk mencari masalah sebenar dalam semua kod yang kusut. Jadi... mari kita nyahpepijat!

Penyahpepijatan

Dalam Python, kami mempunyai PDB, perpustakaan mudah untuk menyahpepijat kod kami. Untuk menggunakannya, anda hanya perlu memasangnya menggunakan pip. Contohnya:

pip install pdb 

Kemudian tambah satu baris dalam kod yang anda mahu nyahpepijat:

import pdb; pdb.set_trace()

Ini akan menjadi titik putus anda. Kini, anda boleh menjalankan aplikasi anda sekali lagi, dan ia akan menjeda pelaksanaan sejurus selepas baris yang baru anda tambahkan. Anda kemudian boleh melangkah melalui kod anda, baris demi baris dan fungsi mengikut fungsi, untuk mencari isu yang perlu anda tangani.

Dengan Docker

Persediaan di atas sepatutnya memadai untuk projek Python yang ringkas dengan Django, Flask atau FastAPI. Walau bagaimanapun, jika anda telah mencapai tahap ini dan menjalankan aplikasi anda di dalam bekas Docker, menghadapi masalah, saya telah melalui jalan yang sama. Bertenang dan ikuti beberapa langkah berikut:

1 - Daripada PDB biasa, anda harus memasang penyahpepijat jauh. Jalankan ia di dalam bekas Docker anda (atau sertakan pustaka dalam pengurus dependensi anda):

pip install remote-pdb 

2 - Dalam fail docker-compose.yml anda, tambah port baharu untuk mendedahkan titik masuk PDB:

...
services:
  your-app:
    ...
    ports:
      - 8000:8000 # already existing port of your application
      - 4444:4444 # NEW LINE TO EXPOSE PDB PORT
    ...
...

3 - Masih dalam fail docker-compose.yml anda, tambah dua baris ini, untuk membenarkan penghantaran arahan dari luar Docker ke bekas berjalan anda:

...
services:
  your-app:
    ...
    ports:
      - 8000:8000
      - 4444:4444
    stdin_open: true # THIS
    tty: true        # AND THIS
    ...
...

4 - Akhir sekali, tukar garis titik putus dalam kod anda kepada yang ini:

__import__("remote_pdb").set_trace(host='0.0.0.0', port=4444)

Kini anda boleh menjalankan imej Docker anda juga dan menyambung dengan penyahpepijat PDB daripada port 4444, yang kami buka, menggunakan arahan telnet mudah dalam terminal kegemaran anda:

telnet 0.0.0.0 4444

Perintah PDB

Untuk belayar dengan bijak melalui lautan kod anda, anda perlu menggunakan arahan berguna yang disediakan oleh PDB. Mari lihat sebahagian daripada mereka di sini:

Saya biasanya hanya menggunakan arahan langkah (s) dan seterusnya (n). Perbezaan antara kedua-duanya ialah langkah melaksanakan setiap baris, malah yang berada di dalam fungsi yang dipanggil pada yang semasa. Dan seterusnya hanya laksanakan baris di dalam fungsi semasa, menunggu pemulangan fungsi yang dipanggil.

Dua arahan lain yang berguna ialah kembali (r), yang melaksanakan semua fungsi sehingga ia kembali, dan teruskan (c), yang melaksanakan segala-galanya sehingga titik putus seterusnya.

Kesimpulan

Saya harap kandungan ini telah membantu anda. Melalui menyiasat isu prestasi yang penting dan mengukuhkan pembelajaran saya semasa menulis teks ini, saya boleh menjamin bahawa

"menggunakan alat yang betul untuk kerja yang betul"

adalah sesuatu yang tidak boleh kita lupakan sebagai pembangun perisian. Ia boleh meningkatkan kerjaya kita ke tahap yang lebih berkesan dan membawa lebih kegembiraan kepada perjalanan rollercoaster ini.

Atas ialah kandungan terperinci Bagaimana untuk menyahpepijat aplikasi Python dan Django di dalam bekas Docker. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn