Проблемы непрерывной интеграции
Вкратце: Docker в 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
), чтобы разрешить вид Доступ вам нужен к «общему» объему данных. Эти контейнеры будут запускаться рядом с родительским, а не под ним, вызывая синхронный ввод-вывод. Теперь у вас есть то же самое (почти), что и у dind, но без недостатков, которые идут с Docker, не предназначенным для параллелизма.
Ссылка (из OP): Использование Docker-in-Docker для вашей CI или среды тестирования? Подумай дважды.