ข้อกังวลของการผนวกรวมอย่างต่อเนื่อง
ในระยะสั้น: นักเทียบท่าในนักเทียบท่า (dind) ไม่จัดการการทำงานพร้อมกันได้ดี
เหตุผลที่คุณไม่ควรใช้ dind สำหรับ CI คือเนื่องจาก Docker ได้รับการออกแบบให้มีการเข้าถึงแบบเอกสิทธิ์เฉพาะบุคคลในไดเรกทอรีที่ใช้สำหรับการจัดเก็บ (ปกติ/var/lib/docker
) Dind ไม่เคารพสิ่งนี้เนื่องจากกระบวนการลูกทั้งหมดใช้ไดเรกทอรีนี้พร้อมกัน ทุกครั้งที่คุณสร้างใหม่ (จาก CI เป็นต้น) สิ่งที่เกี่ยวข้องกับแอปของคุณในไดเรกทอรีนี้อาจถูกลบออกและถูกบังคับให้เริ่มจากศูนย์ ผู้ใช้ของคุณจะชอบอย่างไรหากพวกเขาป้อนรายละเอียดการชำระเงินคลิก "สั่งซื้อ" และพบว่าพวกเขากลับมาที่หน้าจอเข้าสู่ระบบราวกับว่าพวกเขาไม่เคยทำอะไรเลย? นั่นเป็นเพียงไม่ดี UX มีการสร้างใหม่สองครั้งพร้อมกันหรือไม่ มันจะจบลงอย่างเลวร้ายสำหรับทุกคนที่เกี่ยวข้อง (รวมถึงความถูกต้องของข้อมูล)
ข้อกังวลอื่น ๆ
จากลิงค์ของ OP ที่โพสต์ปัญหาด้านความปลอดภัยเกิดขึ้นเนื่องจากระบบจะพยายามนำนโยบายความปลอดภัยมาใช้ในลักษณะ "คล้าย CSS" โดยที่คอนเทนเนอร์ที่ต่ำกว่าสามารถเข้าถึงทรัพยากรของคอนเทนเนอร์ภายนอกได้ จำไว้ว่าเมื่อใดที่คุณสามารถเข้าถึงทรัพยากรของเว็บเซิร์ฟเวอร์โดยทำเช่น "mywebsite.com/../another_folder/private_resource.txt" นอกจากนี้บางครั้งระบบไฟล์ก็ไม่สามารถเล่นกันได้ดีเมื่อซ้อนกันด้วยวิธีนี้
การแก้ไข
โชคดีที่การโพสต์บล็อกใน OP มีวิธีแก้ปัญหาที่ดี เว้นแต่ว่าคุณจะไม่ได้พบกับ "build / run / push Docker container จากระบบ CI ของคุณเองที่ทำงานบน Docker" คุณสามารถใช้-v
โหมด (เพิ่มปริมาณข้อมูลลงในคอนเทนเนอร์ของคุณ) บนซ็อกเก็ต Docker (โดยปกติ/var/run/docker.sock:/var/run/docker.sock
) เพื่อให้ชนิดของ การเข้าถึงที่คุณต้องการกับปริมาณข้อมูลที่ "แชร์" คอนเทนเนอร์เหล่านี้จะเริ่มต้นพร้อมกับผู้ปกครองแทนที่จะบังคับให้ซิงโครนัส IO ตอนนี้คุณมีสิ่งเดียวกัน (เกือบ) เป็น dind แต่ไม่มีข้อเสียที่มาพร้อมกับ Docker ที่ไม่ได้ถูกสร้างขึ้นเพื่อการทำงานพร้อมกัน
ข้อมูลอ้างอิง (จาก OP): การใช้ Docker-in-Docker สำหรับ CI หรือสภาพแวดล้อมการทดสอบของคุณหรือไม่ คิดสองครั้ง