Sürekli Entegrasyon Kaygıları
Kısacası: Docker’daki Dock (dind) eşzamanlılığı iyi işlemez.
CI için dind kullanmamanızın nedeni, Docker'ın depolama için kullandığı dizine (normalde /var/lib/docker
) özel erişim sağlayacak şekilde tasarlanmasıdır . Dind buna saygı duymuyor çünkü tüm alt işlemler bu dizini aynı anda kullanıyor. Her seferinde (örneğin CI'den) her yeniden oluşturduğunuzda, bu dizindeki uygulamanızla ilgili herhangi bir şey silinerek sıfırdan başlamaya zorlanabilir. Kullanıcılarınız, ödeme ayrıntılarını girip "Satın Al" ı tıkladılar ve aniden bir şey yapmamışlar gibi giriş ekranlarında aniden kendilerini bulsa nasıl sevinirdi? Bu sadece iyi UX değil. Bir seferde iki yeniden inşa olur mu? Bu, katılan herkes için (veri bütünlüğünüz dahil) gerçekten kötü bir şekilde bitecek.
Diğer endişeler
OP'nin gönderdiği bağlantıdan, güvenlik politikaları, sistemin güvenlik politikalarını, açıkça yasaklanmadıkça daha düşük bir konteynerin dış konteyner kaynaklarına erişebileceği çok "CSS benzeri" bir biçimde uygulamaya çalışacağı için ortaya çıkacaktır. "Mywebsite.com/../another_folder/private_resource.txt" gibi bir şey yaparak web sunucusu kaynaklarına ne zaman erişebileceğinizi hatırlıyor musunuz? Ayrıca, bazen dosya sistemleri iç içe olduklarında birbirleriyle iyi oynamazlar.
Çözüm
Neyse ki, OP’deki blog gönderisinin bu sorun için iyi bir çözümü var. İhtiyaçlarınızı "Docker'da çalışan CI sisteminizden Docker kapsayıcılarını oluştur / çalıştır / çalıştır / zorla" ile karşılanmadıkça , Docker soketindeki (genellikle ) -v
modunu (kapsayıcınıza veri hacmi ekleme /var/run/docker.sock:/var/run/docker.sock
) kullanabilirsiniz (genellikle ) "paylaşılan" veri hacmine ihtiyacınız var. Bu konteynırlar, eşzamanlı IO'yu zorlamak için, altındakiler yerine ana boyunca başlatılacaktır. Şimdi dind olarak değil Docker eşzamanlılık için inşa olmamak ile gelen olumsuzlukları olmadan aynı şeyi (neredeyse) var.
Referans (OP'den): CI'nız için docker-in-Docker mı yoksa test ortamınız mı? İki kere düşün.