Kekhawatiran Integrasi Berkelanjutan
Singkatnya: Docker di Docker (dind) tidak menangani konkurensi dengan baik.
Alasan mengapa Anda tidak boleh menggunakan dind untuk CI adalah karena Docker dirancang untuk memiliki akses eksklusif ke direktori yang digunakannya untuk penyimpanan (biasanya /var/lib/docker
). Dind tidak menghargai ini karena semua proses anak menggunakan direktori ini secara bersamaan. Setiap kali Anda membangun kembali (dari CI misalnya), apa pun yang terkait dengan aplikasi Anda dalam direktori ini bisa terhapus dan dipaksa untuk memulai dari nol. Bagaimana pengguna Anda akan suka jika mereka memasukkan rincian pembayaran mereka, mengklik "Beli", dan tiba-tiba menemukan diri mereka kembali di layar login seolah-olah mereka tidak pernah melakukan apa pun? Itu hanya UX yang tidak bagus. Dua pembangunan kembali terjadi sekaligus? Itu benar-benar akan berakhir buruk bagi semua orang yang terlibat (termasuk integritas data Anda).
Kekhawatiran lainnya
Dari tautan yang diposkan OP, kekhawatiran keamanan muncul karena sistem akan mencoba menerapkan kebijakan keamanan dengan cara yang sangat "mirip-CSS" di mana wadah yang lebih rendah dapat memiliki akses ke sumber daya penampung luar kecuali dilarang secara eksplisit. Ingat ketika Anda dapat mengakses sumber daya server web dengan melakukan sesuatu seperti "mywebsite.com/../another_folder/private_resource.txt"? Juga, kadang-kadang filesystem tidak bermain dengan baik satu sama lain ketika mereka bersarang dengan cara ini.
Cara Mengatasinya
Untungnya, posting blog di OP memiliki solusi yang bagus untuk masalah ini. Kecuali jika kebutuhan Anda tidak terpenuhi oleh "bangun / jalankan / dorong wadah Docker dari sistem CI Anda sendiri yang berjalan di Docker", Anda dapat menggunakan -v
mode (tambahkan volume data ke wadah Anda) pada soket Docker (biasanya /var/run/docker.sock:/var/run/docker.sock
) untuk memungkinkan jenis akses yang Anda butuhkan ke volume data "bersama". Wadah-wadah ini akan dimulai bersama induknya, bukannya di bawahnya, memaksa IO sinkron. Sekarang Anda memiliki hal yang sama (hampir) seperti dind tetapi tanpa kelemahan yang datang dengan Docker tidak dibangun untuk konkurensi.
Referensi (dari OP): Menggunakan Docker-in-Docker untuk CI Anda atau lingkungan pengujian? Berpikir dua kali.