Побоювання щодо постійної інтеграції
Коротше кажучи: Docker in Docker (dind) не справляється з одночасністю.
Причина, чому ви не повинні використовувати dind для CI, полягає в тому, що Docker був розроблений, щоб мати виключний доступ до каталогу, який він використовує для зберігання (як правило /var/lib/docker
). Dind не поважає цього, оскільки всі дочірні процеси використовують цей каталог одночасно. Кожен раз, коли ви перебудовуєте (наприклад, з CI), все, що стосується вашої програми в цьому каталозі, може бути викреслене і змушене почати з нуля. Як вашим користувачам сподобається, якби вони ввели свої платіжні реквізити, натиснули "Придбати" і раптом опинилися на екрані входу так, ніби ніколи нічого не робили? Це просто не добре UX. Дві відбудови відбуваються одразу? Це дійсно погано закінчиться для всіх учасників (включаючи цілісність даних).
Інші проблеми
З посилання, розміщеного в ОП, виникають занепокоєння щодо безпеки, оскільки система намагатиметься застосовувати політику безпеки дуже "CSS-подібним" способом, коли нижній контейнер може мати доступ до ресурсів зовнішнього контейнера, якщо прямо не заборонено. Пам'ятаєте, коли ви могли отримати доступ до ресурсів веб-сервера, зробивши щось на кшталт "mywebsite.com/../another_folder/private_resource.txt"? Крім того, іноді файлові системи просто не грають один з одним, коли вони вкладені таким чином.
Виправлення
На щастя, публікація блогу в ОП має гарне вирішення питання. Якщо ваші потреби не будуть задоволені "побудувати / запустити / натиснути контейнери Docker з самої вашої системи CI, що працює на Docker", ви можете використовувати -v
режим (додавання обсягу даних у ваш контейнер) на Docker-сокет (як правило /var/run/docker.sock:/var/run/docker.sock
), щоб дозволити тип доступ вам потрібен до "спільного" обсягу даних. Ці контейнери будуть запускатися поряд із материнськими, а не під ними, примушуючи синхронний IO. Тепер у вас (майже) те саме, що і dind, але без недоліків, які Docker не будують для одночасності.
Довідка (від OP): Використання Docker-in-Docker для вашої CI або тестового середовища? Подумай двічі.