การเรียกใช้ Docker ภายใน Docker (aka dind ) ควรหลีกเลี่ยงหากเป็นไปได้ (แหล่งที่มาให้ไว้ด้านล่าง) แต่คุณต้องการตั้งค่าวิธีสำหรับคอนเทนเนอร์หลักของคุณในการผลิตและสื่อสารกับคอนเทนเนอร์พี่น้อง
Jérôme Petazzoni - ผู้เขียนของคุณลักษณะที่ทำให้มันเป็นไปได้สำหรับนักเทียบท่าเพื่อให้ทำงานได้ภายในภาชนะหาง - จริงเขียนบล็อกโพสต์บอกว่าจะไม่ทำมัน กรณีการใช้งานที่เขาอธิบายตรงกับกรณีการใช้งานที่แน่นอนของ OP ของคอนเทนเนอร์ CI Docker ที่ต้องใช้งานภายในคอนเทนเนอร์ Docker อื่น
Petazzoni แสดงเหตุผลสองประการที่ว่าดินมีปัญหา:
- ไม่ร่วมมือกับ Linux Security Modules (LSM) ได้ดี
- มันสร้างความไม่ตรงกันในระบบไฟล์ที่สร้างปัญหาสำหรับคอนเทนเนอร์ที่สร้างขึ้นภายในคอนเทนเนอร์หลัก
จากโพสต์บล็อกนั้นเขาอธิบายทางเลือกต่อไปนี้
[วิธีที่ง่ายที่สุด] คือการเปิดเผยซ็อกเก็ต Docker กับคอนเทนเนอร์ CI ของคุณโดยผูกติดกับ-v
ธง
เพียงแค่ใส่เมื่อคุณเริ่มต้น CI container ของคุณ (Jenkins หรืออื่น ๆ ) แทนที่จะแฮ็คบางอย่างร่วมกับ Docker-in-Docker ให้เริ่มด้วย:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
ตอนนี้คอนเทนเนอร์นี้จะเข้าถึงซ็อกเก็ต Docker และจะสามารถเริ่มต้นคอนเทนเนอร์ได้ ยกเว้นว่าแทนที่จะเริ่มต้นคอนเทนเนอร์ "child" มันจะเริ่มต้นคอนเทนเนอร์ "sibling"