init kecil tapi valid untuk wadah Tini adalah init paling sederhana yang dapat Anda pikirkan.
Yang dilakukan Tini adalah menelurkan satu anak tunggal (Tini dimaksudkan untuk dijalankan dalam wadah), dan menunggu untuk keluar dari semua saat menuai zombie dan melakukan penerusan sinyal.
Menggunakan tini memiliki beberapa manfaat:
SIGTERM mengakhiri proses Anda dengan benar bahkan jika Anda tidak secara eksplisit memasang penangan sinyal untuk itu.Jika Anda ingin lebih detail tentang mengapa ini berguna, tinjau diskusi masalah ini: Apa keuntungan dari Tini?
CATATAN: Jika Anda menggunakan Docker 1.13 atau lebih besar, TINI termasuk dalam Docker itu sendiri. Ini termasuk semua versi Docker CE. Untuk mengaktifkan Tini, cukup lewati bendera --init ke docker run .
Catatan: Ada gambar Docker yang sudah dibangun yang tersedia untuk Tini. Jika Anda saat ini menggunakan gambar Ubuntu atau CentOS sebagai basis Anda, Anda dapat menggunakan salah satunya sebagai pengganti drop-in.
Catatan: Ada paket Tini untuk alpine Linux dan Nixos. Lihat di bawah untuk instruksi instalasi.
Tambahkan tini ke wadah Anda, dan membuatnya dapat dieksekusi. Kemudian, cukup panggangkan Tini dan lulus program Anda dan argumennya sebagai argumen untuk Tini.
Di Docker, Anda ingin menggunakan titik masuk sehingga Anda tidak perlu ingat untuk secara manual memohon Tini:
# Add Tini
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]
# Run your program under Tini
CMD ["/your/program", "-and", "-its", "arguments"]
# or docker run your-image /your/program ...
Perhatikan bahwa Anda dapat melewatkan -- dalam kondisi tertentu, tetapi Anda mungkin juga selalu memasukkannya dengan aman. Jika Anda melihat pesan kesalahan yang terlihat seperti tini: invalid option -- 'c' , maka Anda perlu menambahkan -- .
Argumen untuk tini sendiri harus dilewati seperti -v dalam contoh berikut: /tini -v -- /your/program .
CATATAN: Biner yang ditautkan di atas adalah biner 64-bit yang terkait secara dinamis.
Binari tini dan tini-static ditandatangani menggunakan kunci 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 .
Anda dapat memverifikasi tanda tangan mereka menggunakan gpg (yang dapat Anda instal menggunakan manajer paket Anda):
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini.asc /tini.asc
RUN gpg --batch --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7
&& gpg --batch --verify /tini.asc /tini
RUN chmod +x /tini
Binari tini dan tini-static telah menghasilkan checksum ( SHA1 dan SHA256 ).
Anda dapat memverifikasi checksum mereka menggunakan sha1sum dan sha256sum (yang dapat Anda instal menggunakan manajer paket Anda):
ENV TINI_VERSION v0.19.0
RUN wget --no-check-certificate --no-cookies --quiet https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64
&& wget --no-check-certificate --no-cookies --quiet https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64.sha256sum
&& echo "$(cat tini-amd64.sha256sum)" | sha256sum -c
Di Alpine Linux, Anda dapat menggunakan perintah berikut untuk menginstal Tini:
RUN apk add --no-cache tini
# Tini is now available at /sbin/tini
ENTRYPOINT ["/sbin/tini", "--"]
Menggunakan Nix, Anda dapat menggunakan perintah berikut untuk menginstal Tini:
nix-env --install tini
Di Debian (Buster atau yang lebih baru), Anda dapat menggunakan perintah berikut untuk menginstal Tini:
apt-get install tini
Perhatikan bahwa ini menginstal /usr/bin/tini (dan /usr/bin/tini-static ), bukan /tini .
Di Arch Linux, ada paket yang tersedia di AUR. Instal menggunakan instruksi resmi atau gunakan penolong AUR:
pacaur -S tini
Binari lengan dan 32-bit tersedia! Anda dapat menemukan daftar lengkap binari yang tersedia di bawah tab Rilis.
Argumen -v dapat digunakan untuk output verbose tambahan (Anda dapat melewatkannya hingga 3 kali, misalnya -vvv ).
Secara default, Tini perlu berjalan sebagai PID 1 sehingga dapat menuai zombie (dengan berjalan sebagai PID 1, zombie dapat diarahkan kembali ke Tini).
Jika karena alasan tertentu, Anda tidak dapat menjalankan tini sebagai PID 1, Anda harus mendaftarkan Tini sebagai proses yang lebih besar (hanya di Linux> = 3.4), oleh baik:
-s ke tini ( tini -s -- ... )TINI_SUBREAPER (misalnya export TINI_SUBREAPER= ).Ini akan memastikan bahwa zombie menjadi orangtua kembali ke tini meskipun tini tidak berjalan sebagai pid 1.
Catatan: Tini akan mengeluarkan peringatan jika mendeteksi bahwa itu tidak berjalan sebagai PID 1 dan tidak terdaftar sebagai subreaper. Jika Anda tidak melihat peringatan, Anda baik -baik saja.
Tini akan menggunakan kembali kode keluar anak saat keluar, tetapi kadang -kadang, ini mungkin tidak persis seperti yang Anda inginkan (misalnya jika anak Anda keluar dengan 143 setelah menerima sigterm). Khususnya, ini bisa menjadi masalah dengan aplikasi Java.
Dalam hal ini, Anda dapat menggunakan bendera -e untuk memetakan kembali kode keluar sewenang -wenang ke 0. Anda dapat melewati bendera beberapa kali jika diperlukan.
Misalnya:
tini -e 143 -- ...
Secara default, Tini hanya membunuh proses anak dekatnya. Ini bisa merepotkan jika mengirim sinyal ke proses itu tidak memiliki efek yang diinginkan. Misalnya, jika Anda melakukannya
docker run krallin/ubuntu-tini sh -c 'sleep 10'
Dan Ctrl-C, tidak ada yang terjadi: Sigint dikirim ke proses 'sh', tetapi cangkang itu tidak akan bereaksi terhadapnya saat menunggu 'tidur' selesai.
Dengan opsi -g , Tini membunuh kelompok proses anak, sehingga setiap proses dalam kelompok mendapatkan sinyal. Ini lebih dekat dengan apa yang terjadi ketika Anda melakukan ctrl-c dll. Di terminal: sinyal dikirim ke kelompok proses latar depan.
Tini dapat mengatur sinyal kematian induknya, yang merupakan sinyal yang harus diterima Tini ketika induknya keluar. Untuk mengatur sinyal kematian induk, gunakan bendera -p dengan nama sinyal yang harus diterima Tini ketika induknya keluar:
tini -p SIGTERM -- ...
Catatan: Lihat diskusi PR ini untuk mempelajari lebih lanjut tentang sinyal kematian orang tua dan kasus penggunaan.
Tini juga dapat digunakan dengan titik masuk yang ada di wadah Anda!
Dengan asumsi titik entri Anda adalah /docker-entrypoint.sh , maka Anda akan menggunakan:
ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"]
Tini memiliki sangat sedikit dependensi (hanya tergantung pada libc), tetapi jika wadah Anda gagal memulai, Anda mungkin ingin mempertimbangkan untuk menggunakan versi yang dibangun secara statis sebagai gantinya:
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /tini
Tini adalah file yang sangat kecil (dalam kisaran 10kb), sehingga tidak menambah banyak bobot pada wadah Anda.
Versi yang terkait secara statis lebih besar, tetapi masih <1m.
Jika Anda lebih suka tidak mengunduh biner, Anda dapat membangun tini dengan menjalankan cmake . && make .
Sebelum membangun, Anda mungkin juga ingin menjalankan:
export CFLAGS="-DPR_SET_CHILD_SUBREAPER=36 -DPR_GET_CHILD_SUBREAPER=37"
Ini memastikan bahwa bahkan jika Anda membangun sistem yang memiliki header kernel Linux lama (<3,4), Tini akan dibangun dengan tunjangan anak yang lebih rendah. Ini biasanya yang Anda inginkan jika Anda akan menggunakan Tini dengan Docker (jika kernel tuan rumah Anda mendukung Docker, itu juga harus mendukung anak -anak Subreapers).
Setelah melahirkan proses Anda, Tini akan menunggu sinyal dan meneruskannya ke proses anak, dan secara berkala menuai proses zombie yang mungkin dibuat di dalam wadah Anda.
Ketika proses anak "pertama" keluar ( /your/program dalam contoh di atas), Tini juga keluar, dengan kode keluar dari proses anak (sehingga Anda dapat memeriksa kode keluar wadah Anda untuk mengetahui apakah anak itu berhasil keluar).
Jika sesuatu tidak berfungsi seperti yang Anda harapkan, pertimbangkan untuk meningkatkan level verbositas (hingga 3):
tini -v -- bash -c 'exit 1'
tini -vv -- true
tini -vvv -- pwd
Pemelihara:
Kontributor:
Terima kasih khusus kepada: