Запуск Docker внутри Docker (aka dind ), по возможности, следует избегать, если это вообще возможно. (Источник предоставлен ниже.) Вместо этого вы хотите настроить способ, с помощью которого ваш главный контейнер будет производить и взаимодействовать с ним. одноуровневыми контейнерами.
Жером Петаццони - автор функции, позволившей Docker запускаться в контейнере Docker, - на самом деле написал сообщение в блоге, в котором говорилось, что не следует этого делать . Описанный им вариант использования соответствует точному сценарию использования OP контейнера Docker CI, который должен запускать задания внутри других контейнеров Docker.
Петаццони перечисляет две причины, по которым Динд мешает:
- Он плохо взаимодействует с модулями безопасности Linux (LSM).
- Это создает несоответствие в файловых системах, что создает проблемы для контейнеров, созданных внутри родительских контейнеров.
Из этого поста в блоге он описывает следующую альтернативу:
[Самый простой способ] - просто выставить сокет Docker для вашего контейнера CI, привязав его с помощью -v
флагу.
Проще говоря, когда вы запускаете свой CI-контейнер (Jenkins или другой), вместо того, чтобы взламывать что-то вместе с Docker-in-Docker, начните его с:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
Теперь этот контейнер будет иметь доступ к сокету Docker и, следовательно, сможет запускать контейнеры. За исключением того, что вместо запуска «дочерних» контейнеров, он запускает «родственные» контейнеры.