Katakanlah saya memiliki wadah sepele berdasarkan ubuntu:latest
. Sekarang ada pembaruan keamanan dan ubuntu:latest
diperbarui di repo buruh pelabuhan.
Bagaimana saya tahu gambar lokal saya dan wadahnya berjalan di belakang?
Apakah ada beberapa praktik terbaik untuk secara otomatis memperbarui gambar dan wadah lokal untuk mengikuti pembaruan repo buruh pelabuhan, yang dalam praktiknya akan memberi Anda keramahtamahan yang sama dengan memiliki peningkatan tanpa pengawasan yang berjalan pada mesin ubuntu konvensional
docker
automatic-updates
hbogert
sumber
sumber
Jawaban:
Salah satu cara untuk melakukannya adalah mengendarainya melalui sistem CI / CD Anda. Setelah gambar induk Anda dibuat, miliki sesuatu yang memindai repositori git Anda untuk gambar menggunakan orangtua itu. Jika ditemukan, Anda kemudian akan mengirimkan permintaan tarik untuk menabrak versi baru gambar. Permintaan tarik, jika semua tes lulus, akan digabung dan Anda akan memiliki gambar anak baru berdasarkan orang tua yang diperbarui. Contoh alat yang menggunakan pendekatan ini dapat ditemukan di sini: https://engineering.salesforce.com/open-sourcing-dockerfile-image-update-6400121c1a75 .
Jika Anda tidak mengontrol gambar induk Anda, seperti halnya jika Anda bergantung pada
ubuntu
gambar resmi , Anda dapat menulis beberapa alat yang mendeteksi perubahan pada tag gambar induk atau checksum (bukan hal yang sama, tag dapat diubah) dan memohon gambar anak membangun sesuai.sumber
Kami menggunakan skrip yang memeriksa apakah wadah berjalan dimulai dengan gambar terbaru. Kami juga menggunakan skrip init pemula untuk memulai gambar buruh pelabuhan.
Dan init sepertinya
sumber
redis
),LATEST=`docker inspect --format "{{.Id}}" $IMAGE`
Akan mendapatkan info wadah. Tambahkan--type image
untuk memperbaikinya.for IMAGE in $(docker ps --format {{.Image}} -q | sort -u)
Suatu 'cara buruh pelabuhan' adalah dengan menggunakan bangunan pelabuhan otomatis . Fitur Tautan Repositori akan membangun kembali wadah Anda saat wadah hulu dibangun kembali, dan fitur Webhooks akan mengirimi Anda pemberitahuan.
Sepertinya webhooks terbatas pada panggilan HTTP POST. Anda perlu mengatur layanan untuk menangkap mereka, atau mungkin menggunakan salah satu POST untuk mengirim email layanan di luar sana.
Saya belum memeriksanya, tetapi Docker Universal Control Plane yang baru mungkin memiliki fitur untuk mendeteksi kontainer yang diperbarui dan digunakan kembali.
sumber
Anda dapat menggunakan Menara Pengawal untuk menonton pembaruan untuk gambar wadah berasal dari dan secara otomatis menarik pembaruan dan restart wadah menggunakan gambar yang diperbarui. Namun, itu tidak menyelesaikan masalah membangun kembali gambar khusus Anda sendiri ketika ada perubahan pada gambar hulu yang menjadi dasarnya. Anda dapat melihat ini sebagai masalah dua bagian: (1) mengetahui kapan gambar hulu telah diperbarui, dan (2) melakukan gambar yang sebenarnya dibangun kembali. (1) dapat diselesaikan dengan cukup mudah, tetapi (2) sangat tergantung pada lingkungan / praktik pembangunan lokal Anda, jadi mungkin lebih sulit untuk membuat solusi umum untuk itu.
Jika Anda dapat menggunakan bangunan otomatis Docker Hub , seluruh masalah dapat diselesaikan secara relatif bersih menggunakan fitur tautan repositori , yang memungkinkan Anda memicu pembangunan kembali secara otomatis ketika repositori terkait (mungkin yang upstream) diperbarui. Anda juga dapat mengonfigurasi webhook untuk memberi tahu Anda ketika build otomatis terjadi. Jika Anda ingin pemberitahuan email atau SMS, Anda bisa menghubungkan webhook ke IFTTT Maker . Saya menemukan antarmuka pengguna IFTTT agak membingungkan, tetapi Anda akan mengkonfigurasi webhook Docker untuk dikirim ke https://maker.ifttt.com/trigger/
docker_xyz_image_built
/ with / key /your_key
.Jika Anda perlu membuat secara lokal, Anda setidaknya bisa menyelesaikan masalah mendapatkan pemberitahuan ketika gambar hulu diperbarui dengan membuat repo tiruan di Docker Hub yang ditautkan dengan repo Anda yang menarik. Satu-satunya tujuan repo tiruan adalah untuk memicu webhook ketika akan dibangun kembali (yang menyiratkan salah satu repo terkait yang diperbarui). Jika Anda dapat menerima webhook ini, Anda bahkan dapat menggunakannya untuk memicu pembangunan kembali di sisi Anda.
sumber
REPO_USER
danREPO_PASS
variabel lingkungan. Lihatlah readme.md dari Menara Pengawal untuk info lebih lanjut: github.com/v2tec/watchtower#usageSaya memiliki masalah yang sama dan berpikir itu bisa diselesaikan dengan cron job calling
unattended-upgrade
setiap hari.Tujuan saya adalah menjadikan ini sebagai solusi otomatis dan cepat untuk memastikan bahwa wadah produksi aman dan diperbarui karena kadang-kadang saya perlu memperbarui gambar saya dan menggunakan gambar buruh pelabuhan baru dengan pembaruan keamanan terbaru.
Dimungkinkan pula untuk mengotomatisasi pembuatan dan penyebaran gambar dengan kait Github
Saya telah membuat gambar buruh pelabuhan dasar dengan yang secara otomatis memeriksa dan menginstal pembaruan keamanan setiap hari (dapat dijalankan langsung oleh
docker run itech/docker-unattended-upgrade
).Saya juga menemukan pendekatan lain yang berbeda untuk memeriksa apakah wadah perlu pembaruan.
Implementasi lengkap saya:
Dockerfile
Skrip pembantu
Install
Mulailah
Edit
Saya mengembangkan alat docker-run kecil yang berfungsi sebagai wadah buruh pelabuhan dan dapat digunakan untuk memperbarui paket di dalam semua atau kontainer yang berjalan yang dipilih, itu juga dapat digunakan untuk menjalankan perintah sewenang-wenang.
Dapat dengan mudah diuji dengan perintah berikut:
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec
yang secara default akan menjalankan
date
perintah di semua wadah yang berjalan dan menampilkan hasilnya. Jika Anda lulusupdate
alih-alihexec
itu akan menjalankanapt-get update
diikuti olehapt-get upgrade -y
di semua wadah berjalansumber
Kubernetes
yang berguna untuk penyebaran infrastruktur besar, tetapi masih dalam pengembangan berat oleh Google. Saat ini, Anda dapat mengotomatisasi ini dengan alat penyediaan seperti Ansible dengan cara yang cukup sederhana.Anda tidak akan tahu wadah Anda ada di belakang tanpa menjalankan docker pull . Maka Anda perlu membangun kembali atau menyusun ulang gambar Anda.
Perintah dapat dimasukkan ke dalam skrip bersama dengan apa pun yang diperlukan untuk menyelesaikan upgrade, meskipun wadah yang tepat tidak memerlukan tambahan apa pun.
sumber
Manajemen ketergantungan untuk gambar Docker adalah masalah nyata. Saya bagian dari tim yang membuat alat, MicroBadger , untuk membantu dengan memantau gambar kontainer dan memeriksa metadata. Salah satu fiturnya adalah untuk memungkinkan Anda menyiapkan webhook pemberitahuan yang dipanggil saat gambar yang Anda minati (misalnya gambar dasar) berubah.
sumber
Ada banyak jawaban di sini, tetapi tidak ada yang sesuai dengan kebutuhan saya. Saya ingin jawaban aktual untuk pertanyaan si penanya # 1. Bagaimana saya tahu ketika gambar diperbarui di hub.docker.com?
Script di bawah ini dapat dijalankan setiap hari. Saat pertama kali dijalankan, tag akan mendapat garis dasar dan memperbarui tanggal dari registri HUB dan menyimpannya secara lokal. Sejak saat itu, setiap kali dijalankan, ia akan memeriksa tanda-tanda baru dan memperbarui tanggal pada registri. Karena ini berubah setiap kali gambar baru ada, itu memberitahu kita jika gambar dasar telah berubah. Ini skripnya:
Anda akan ingin mengubah
DATAPATH
variabel di bagian atas, dan mengubah perintah pemberitahuan email di akhir sesuai dengan kebutuhan Anda. Bagi saya, saya memilikinya SSH ke server di jaringan lain di mana SMTP saya berada. Tapi Anda bisa dengan mudah menggunakanmail
perintah juga.Sekarang, Anda juga ingin memeriksa paket yang diperbarui di dalam wadah itu sendiri. Ini sebenarnya mungkin lebih efektif daripada melakukan "tarikan" begitu wadah Anda bekerja. Berikut skrip untuk melakukan itu:
sumber
Pendekatan lain mungkin dengan mengasumsikan bahwa gambar dasar Anda ketinggalan cukup cepat (dan itu sangat mungkin terjadi), dan memaksakan pembuatan gambar lain dari aplikasi Anda secara berkala (mis. Setiap minggu) dan kemudian gunakan kembali jika telah berubah.
Sejauh yang saya tahu, gambar dasar populer seperti Debian atau Java resmi memperbarui tag mereka untuk memenuhi perbaikan keamanan, sehingga tag tidak dapat diubah (jika Anda menginginkan jaminan yang lebih kuat dari itu, Anda perlu menggunakan referensi [image: @digest ], tersedia dalam versi Docker terbaru). Karena itu, jika Anda ingin membangun citra Anda
docker build --pull
, maka aplikasi Anda harus mendapatkan tag gambar dasar terbaru dan terbesar yang Anda rujuk.Karena tag yang dapat diubah dapat membingungkan, yang terbaik adalah menambah nomor versi aplikasi Anda setiap kali Anda melakukan ini sehingga setidaknya pada sisi Anda segala sesuatu lebih bersih.
Jadi saya tidak yakin skrip yang disarankan di salah satu jawaban sebelumnya berfungsi, karena skrip tidak membangun kembali gambar aplikasi Anda - hanya memperbarui tag gambar dasar dan kemudian memulai ulang wadah, tetapi wadah baru masih merujuk hash gambar dasar lama.
Saya tidak akan menganjurkan untuk menjalankan pekerjaan jenis cron dalam wadah (atau proses lain, kecuali benar-benar diperlukan) karena ini bertentangan dengan mantra menjalankan hanya satu proses per wadah (ada berbagai argumen tentang mengapa ini lebih baik, jadi saya ' Saya tidak akan membahasnya di sini).
sumber
Saya tidak akan membahas seluruh pertanyaan apakah Anda ingin pembaruan tanpa pengawasan dalam produksi (saya pikir tidak). Saya hanya meninggalkan ini di sini untuk referensi kalau-kalau ada yang merasa berguna. Perbarui semua gambar buruh pelabuhan Anda ke versi terbaru dengan perintah berikut di terminal Anda:
# docker images | awk '(NR>1) && ($2!~/none/) {print $1":"$2}' | xargs -L1 docker pull
sumber
# docker system prune -a --volumes -f
untuk membersihkan gambar-gambar lama (menggantung), volume dll.UPDATE: Gunakan Dependabot - https://dependabot.com/docker/
BLUF: menemukan titik penyisipan yang tepat untuk memantau perubahan pada sebuah wadah adalah tantangannya. Akan lebih bagus jika DockerHub akan menyelesaikan ini. (Tautan Repositori telah disebutkan tetapi perhatikan ketika mengaturnya di DockerHub - "Trigger build dalam repositori ini setiap kali gambar dasar diperbarui pada Docker Hub. Hanya berfungsi untuk gambar yang tidak resmi." )
Ketika mencoba untuk menyelesaikan ini sendiri, saya melihat beberapa rekomendasi untuk webhook jadi saya ingin menguraikan beberapa solusi yang saya gunakan.
Gunakan microbadger.com untuk melacak perubahan dalam sebuah wadah dan gunakan fitur webhook pemberitahuan untuk memicu tindakan. Saya mengatur ini dengan zapier.com (tetapi Anda dapat menggunakan layanan webhook yang dapat disesuaikan) untuk membuat masalah baru di repositori github saya yang menggunakan Alpine sebagai gambar dasar.
Lacak umpan RSS untuk git yang berkomitmen ke wadah hulu. ex. https://github.com/gliderlabs/docker-alpine/commits/rootfs/library-3.8/x86_64 . Saya menggunakan zapier.com untuk memantau umpan ini dan untuk memicu pembangunan otomatis wadah saya di Travis-CI kapan pun ada sesuatu yang dilakukan. Ini sedikit ekstrem tetapi Anda dapat mengubah pelatuk untuk melakukan hal-hal lain seperti membuka masalah di repositori git Anda untuk intervensi manual.
sumber
Premis untuk jawaban saya:
Pendekatan
Selain itu, gambar dasar dapat ditingkatkan / wadah dengan gambar dasar baru yang lengkap dapat dibangun secara berkala, karena pengelola merasa perlu.
Keuntungan
sumber
Jawaban di atas juga benar
Ada dua Pendekatan
Saya hanya membagikan skrip, semoga bermanfaat bagi Anda! Anda dapat menggunakannya dengan cronjob, saya mencoba dengan sukses di OSX
Ini adalah file komposisi buruh pelabuhan saya
sumber
Letakkan pekerjaan melalui
$ crontab -e
:Buat dir
~/.docker
dengan filecron.sh
:sumber
Sudahkah Anda mencoba ini: https://github.com/v2tec/watchtower . itu adalah alat sederhana yang berjalan dalam wadah buruh pelabuhan menonton wadah lain, jika gambar dasarnya berubah, itu akan menarik dan memindahkan.
sumber
Solusi sederhana dan hebat adalah gembala
sumber