Запустите Docker как jenkins-agent, в docker-контейнере как пользователь без полномочий root - PullRequest
0 голосов
/ 31 января 2019

Simular Questions

Dockerfile

FROM  jenkins/jenkins:lts
USER root
RUN apt-get -qq update  && apt-get -qq -y install --no-install-recommends curl
RUN curl -sSL https://get.docker.com/ | sh
RUN usermod -aG docker jenkins
USER jekins

Команда терминала

docker run -p 8080:8080 -p 50000:50000 \
  -v jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -ti bluebrown/docker-in-jenkins-in-docker /bin/bash

Внутри контейнера

docker image ls

Вывод

Got permission denied while trying to connect to the Docker daemon
socket at unix:///var/run/docker.sock: Get
http://%2Fvar%2Frun%2Fdocker.sock/v1.39/images/json: dial unix
/var/run/docker.sock: connect: permission denied

Когда я закомментирую последнюю строку файла dockerfile, чтобы запустить экземпляр от имени пользователя root,

# USER jenkins

Я могу получить доступ к док-сокету без проблем по понятным причинам.Тем не менее, я думаю, что это не правильное решение.Вот почему я хочу спросить, удалось ли кому-либо получить доступ к сокету докера как пользователь без полномочий root.

1 Ответ

0 голосов
/ 31 января 2019

Вы добавили группу докеров к пользователю Jenkins внутри контейнера.Однако это не обязательно сработает, поскольку отображение пользователей и групп на uid и gids может быть различным для хоста и контейнера.Обычно это не проблема, но с томами хоста и другими подключаемыми монтируемыми файлами в контейнере файлы отображаются с тем же uid / gid вместе с разрешениями.Следовательно, внутри контейнера группа докеров не будет иметь доступа к сокету док-станции, если gid не окажется идентичным в двух средах.

Существует несколько решений, включая ручную передачу хоста в качестве gid дляиспользовать внутри контейнера.Или вы можете получить gid хоста и создать образ с жестко запрограммированным значением.

Мое предпочтительное решение состоит в том, чтобы запустить точку входа как root, исправить группу docker внутри контейнера, чтобы соответствовать gidсмонтированный сокет докера, а затем переключитесь на пользователя Jenkins для запуска приложения.Это особенно хорошо работает в средах разработки, где управление uid / gids может быть затруднено.Все шаги / сценарии для этого находятся в моем репо: https://github.com/sudo-bmitch/jenkins-docker

Для производства в контролируемой среде я пытаюсь получить стандартизированные значения uid / gid, как на хосте, так и в контейнерах, для всего, что монтируетсяхост томов.Затем я могу запустить контейнер без шагов корневой точки входа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...