Как часть моей сборки, у меня есть контейнер, содержащий инструменты сборки, которые используются для нескольких проектов. Один из моих проектов содержит этап сборки для создания и публикации контейнера, который выполняется из контейнера build-tools. Мой jenkins-slave с поддержкой докера настроен на использование пользователя jenkins
, который входит в группу docker
. Я использовал -v для монтирования бинарного файла docker и scoket. Это может быть достигнуто / воспроизведено одним из следующих способов:
- Добавьте пользователя (jenkins) и группу (docker) в Dockerfile инструментов сборки и установите для них UID и GID хостов и GID
- Запустите контейнер с параметром -u, указав UID и GUID (согласно документации, пользователь и группа не должны существовать в контейнере).
Проблема с первой стратегией заключается в том, чтоID пользователя и группы на разных машинах сборки разные. Я мог бы исправить это, настроив UID и GID всех машин сборки на одинаковые значения, но разве Docker не должен работать изолированно, не имея много зависимостей от среды / контекста? Это не похоже на правильное решение для меня. Вторая стратегия прекрасно работает в командной строке, однако, похоже, нет способа передать UID и GID команде агента в Jenkinsfile. параметр args
не поддерживает сценарии или переменные, такие как $(id -u)
.
Я ожидал, что не буду первым сталкиваться с этой проблемой, однако я не смог найти решение этой проблемы самостоятельно, поискмашины и переполнение стека. Должен ли я пойти с «готовыми» сборочными рабами или есть способ заставить работать вторую стратегию?
.
-edit- Я понимаю варианты запуска контейнера от имени root и переключения после запуска (например, с использованием точки входа). Тем не менее, для этого потребуется, чтобы мой подчиненный Jenkins был подключен как root, что для меня неприемлемо. Другой найденной альтернативой является chmod777 всех ресурсов, который полностью игнорирует аспект безопасности, заключающийся в том, что подчиненный Jenkins не является пользователем root. Я бы предпочел использовать опцию -u для контейнеров, но не могу найти способ определить UID и GID на ведомом устройстве jenkins до запуска агента докера (команда docker run
) из Jenkinsfile.