Cara menghapus log dari wadah Docker yang sedang berjalan

Kontainer Docker yang berjalan lama dapat dengan cepat mengakumulasi sejumlah besar baris log. Ini menghabiskan kapasitas penyimpanan dan mengurangi kinerja saat mengakses dan memfilter data. Meskipun Docker menyertakan alat bawaan untuk melihat log, tidak ada mekanisme bawaan untuk membersihkannya.

Artikel ini menunjukkan cara menghapus log dari menjalankan container Docker tanpa memulai ulang atau menimpanya. Anda juga akan mempelajari beberapa teknik untuk mengelola catatan besar secara lebih efisien sambil mempertahankan data lama.

Pahami masalahnya

Docker mengumpulkan log dari output standar dan aliran kesalahan dari proses latar depan kontainer. ini docker logs Perintah digunakan untuk mendapatkan catatan ini, tetapi tidak memungkinkan Anda untuk menghapus baris lama.

Docker mendukung banyak driver registri yang berbeda, sehingga tidak mungkin untuk menawarkan mekanisme pembersihan standar. Artikel ini berfokus pada standar json-file Driver log tempat baris log disimpan dalam file JSON pada sistem file host penampung. Lihat dokumentasi driver penyimpanan jika Anda perlu membersihkan log yang dialirkan ke host jarak jauh.

File log dibuat oleh json-file Driver disimpan di bawah /var/lib/docker/containers catatan telepon. Setiap wadah mendapatkan file lognya sendiri yang digunakan selama masa pakainya. Secara default, rotasi rekaman tidak dikonfigurasi.

Menghapus file log saja bukanlah solusi yang efektif. Docker mengharapkan file tersedia setiap saat dan tidak secara otomatis membuat ulang saat dihapus. Lebih aman juga Menyelesaikan Konten jurnal terkini agar tidak mengganggu proses penulisan yang sedang berlangsung.

Temukan jalur file log

Pertama, temukan jalur file log dari wadah target. Anda bisa mendapatkan jalur file log dari wadah bernama my-app Dengan menjalankan perintah berikut:

$ docker inspect --format="{{.LogPath}}" my-app
/var/lib/containers/1380d936...-json.log

Hapus file log

Anda dapat menghapus konten registri tanpa menghapusnya dengan memasukkan string kosong di kontennya. File milik root Jadi proses ini harus dilakukan dalam selubung akar. Perintah berikut menghapus file log untuk Anda:

$ sudo sh -c 'echo "" > $(docker inspect --format="{{.LogPath}}" my-app)'

Interpolasi shell digunakan untuk mengambil jalur file log dari suatu file my-app Wadah. Atau, Anda dapat secara manual menimpa jalur yang diambil sebelumnya.

saat kamu berlari docker logs my-appAnda sekarang akan melihat output kosong kecuali wadah telah menulis lebih banyak baris untuk sementara.

Batasi keluaran log

ini docker logs Perintah menerima beberapa argumen yang dapat digunakan untuk membatasi keluaran log yang bising. Ini membantu mengurangi kebutuhan untuk membersihkan registri sekaligus mencegah terminal Anda dibanjiri font lama setiap kali file diakses.

  • --tail – Bendera ini memberitahu Docker untuk menghapus hanya sejumlah baris log lama, dimulai dengan yang terbaru.
  • --until Dan --since – Bendera ini menentukan output ke baris log yang dihasilkan selama periode waktu tertentu. Mereka berguna ketika Anda mengetahui perkiraan periode waktu di mana peristiwa itu terjadi.

Berikut beberapa contohnya:

Menampilkan 100 baris log terakhir

docker logs my-app --tail 100

Menampilkan baris log yang ditulis dalam satu jam terakhir

docker logs my-app --since 1h

Lihat hingga 100 baris sejarah yang ditulis dalam satu jam terakhir

docker logs my-app --tail 100 --since 1h

Konfigurasikan rotasi log

Jika Anda perlu membersihkan file log secara teratur dengan cara ini, biasanya ini menunjukkan bahwa log aplikasi Anda terlalu panjang atau terlalu banyak aktivitas yang dilakukan untuk memuat satu file.

Banyak driver Docker termasuk file json-fileAnda memiliki dukungan rotasi registri opsional yang dapat Anda aktifkan secara global untuk daemon Docker atau per container.

Pengaturan daemon dikonfigurasi dalam format /etc/docker/daemon.json. Ini adalah contoh yang memutar log kontainer setelah mencapai 8MB. Hingga lima file disimpan sekaligus, dengan file lama secara otomatis dihapus ketika rotasi baru terjadi.

{
    "log-opts": {
        "max-size": "8m",
        "max-file": "5"
    }
}

Jalankan kembali daemon Docker untuk menerapkan perubahan:

$ sudo service docker restart

Rotate pada level daemon berlaku untuk semua container yang baru dibuat. Perubahan tidak memengaruhi penampung yang sudah ada di host Anda.

Rotasi dapat dikonfigurasi untuk wadah individu --log-opts media. Ini akan menimpa pengaturan Docker default Anda.

docker run --name app 
    --log-driver json-file 
    --log-opts max-size=8M 
    --log-opts max-file=5 
    app-image:latest

Ringkasan

Log kontainer Docker dapat mengganggu saat aplikasi yang sibuk menulis output yang berat. Mengakses log terperinci berguna untuk debugging, tetapi menghabiskan memori, membuat navigasi melalui data menjadi sulit, dan dapat memengaruhi kinerja.

Jika perlu, Anda dapat menghapus file log menggunakan perintah shell untuk menghapus isinya. Namun, yang terbaik adalah mengonfigurasi rotasi registri agar terjadi secara otomatis setelah file mencapai ukuran tertentu. ini docker logs Perintah ini juga mendukung flag yang dapat digunakan untuk menjinakkan protokol yang tidak dapat dijalankan di titik akses.

Baca Juga!

Para ilmuwan mengatakan bahwa jika kita mengubah sistem pangan global, kita dapat memberi makan satu miliar orang lagi

Program Pangan Dunia Perserikatan Bangsa-Bangsa melaporkan tahun ini bahwa 345 juta orang di seluruh dunia …