Я новичок в докере. Я просто пытался использовать докер на моей локальной машине (Ubuntu 16.04) с Дженкинсом.
Я настроил новую работу с помощью сценария ниже конвейера.
node {
stage('Build') {
docker.image('maven:3.3.3').inside {
sh 'mvn --version'
}
}
}
Но это не с ошибкой ниже.
docker
jenkins
jenkins-pipeline
Понсуямбу Велладурай
источник
источник
Ответы:
Пользователь
jenkins
должен быть добавлен в группуdocker
:Затем перезапустите Дженкинс.
редактировать
Если вы пришли к этому вопросу о переполнении стека, потому что получили это сообщение от Docker, но не используете jenkins, скорее всего, ошибка та же: ваш непривилегированный пользователь не принадлежит к группе Docker.
Ты можешь сделать:
или как там ваше имя пользователя.
Вы можете проверить это в конце выполнения
grep docker /etc/group
и увидеть что-то вроде этого:в одной из строк.
Затем измените идентификатор группы пользователей на
docker
:источник
sudo usermod -a -G docker $USER
и выйти из системы или перезагрузиться. ссылкаnewgrp docker
вместо этого в том же терминальном сеансе.Моими первыми решениями было:
Но никто из них не работает для меня, я пытался:
Это работает, но я не знаю, правильный ли это вызов.
источник
docker.sock
файлу - не лучшее решение, вам нужно только выполнитьusermod
... инструкции, а затем перезагрузить систему, иначе это не сработаетУспех для меня
источник
2018-08-19
Я застрял в течение нескольких дней на этом, и так как я не нашел полного ответа с почему и как, я опубликую его для других людей, которые сталкиваются с той же проблемой, и ответы сверху не работают.
Вот три важных шага при запуске Jenkins в докере:
/var/run/docker.sock
в контейнер jenkins, чтобы иметь возможность использовать докер с хоста.sudo usermod -a -G docker jenkins
, чтобы добавить Дженкинса в группу Docker. Однако здесь вы можете столкнуться с проблемой прав доступа, если у докера хоста и докера контейнера нет одинакового идентификатора группы, поэтому очень важно настроить GID докера контейнера так, чтобы он совпадал с GID докера хоста.Вы можете сделать это как часть запуска скрипта или просто с помощью
exec
и делать это вручнуюgroupmod -g <YOUR_HOST_DOCKER_GID> docker
.Кроме того , не изменять разрешения из
/var/run/docker.sock
777 или тому подобных , потому что это большой риск безопасности, вы, в основном давая каждый разрешение на использование грузчик на вашей машинеНадеюсь это поможет
источник
Я добавил пользователя jenkins в корневую группу и перезапустил jenkins, и он начал работать.
источник
Изменить права доступа к файлу docker.sock
или вы можете использовать
sudo
в начале команды.chmod 777
разрешит все действия для всех пользователей, покаchmod 666
все пользователи будут читать и писать, но не смогут выполнить файл.источник
Просто добавив
docker
в качестве дополнительной группы дляjenkins
пользователяне всегда достаточно при использовании образа Docker в качестве агента Jenkins . То есть, если ваш
Jenkinsfile
начинается сpipeline{agent{dockerfile
илиpipeline{agent{image
:Это потому, что Дженкинс выполняет
docker run
команду, что приводит к трем проблемам.docker run
что не делает логин для контейнера (это больше похоже на asudo
).Установка Docker для Агента
Чтобы сделать Docker-программы доступными в образе Docker, просто нужно выполнить шаги установки Docker в вашем Dockerfile:
Совместное использование сокета Docker
Как было сказано ранее , для решения второй проблемы необходимо запустить контейнер Jenkins Docker, чтобы он разделял сокет демона Docker с демоном Docker, который находится вне контейнера. Таким образом, вы должны указать Jenkins запустить контейнер Docker с таким общим доступом:
Установка UID и GID
Идеальным решением третьей проблемы было бы создание дополнительных групп для Агента. Это не представляется возможным. Единственное исправление, о котором я знаю, - это запуск Агента с UID Дженкинса и GID Docker (сокет имеет разрешение на запись в группу и принадлежит ему
root.docker
). Но в целом вы не знаете, что это за идентификаторы (они были выделены, когдаuseradd ... jenkins
иgroupadd ... docker
выполнялись, когда на хосте были установлены Jenkins и Docker). И вы не можете просто сказать Jenkins пользователюjenkins
и группе пользователейdocker
потому что это говорит Docker использовать пользователя и группу, которые названы
jenkins
и находятсяdocker
внутри образа , и ваш образ Docker, вероятно, не имеетjenkins
пользователя и группы, и даже если бы это было так, не было бы никакой гарантии, что он будет иметь те же UID и GID, что и хост, и нет аналогичных гарантий, чтоdocker
GID одинаковК счастью, Дженкинс запускает
docker build
команду для вашего Dockerfile в сценарии, поэтому вы можете использовать магию сценария оболочки для передачи этой информации в качестве аргументов сборки Docker:Это использует
id
команду , чтобы получить UID и GID отjenkins
пользователя , так иstat
команд , чтобы получить информацию о гнезде Докера.Ваш Dockerfile может использовать эту информацию для настройки
jenkins
пользователя иdocker
группы для Агента, используяgroupadd
,groupmod
иuseradd
:источник
-u jenkins:$(getent group docker | cut -d: -f3)
?args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
byargs '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:jenkins --group-add docker'
При передаче -u jenkins: docker вы меняете основную группу пользователей, что означает, что когда пользователь пишет файл, скажем, в рабочей области, он устанавливает файл пользователь к Дженкинсу и группа к докеру. Что, вероятно, не то, что мы намереваемся.У меня есть Jenkins, работающий в Docker, и подключенный Jenkins использует сокет Docker с хост-машины Ubuntu 16.04 через том в /var/run/docker.sock.
Для меня решение было:
1) Внутри Docker контейнера Jenkins (
docker exec -it jenkins bash
на хост-машине)2) На хост-машине:
664
означает - читать и писать (но не выполнять) для владельца и пользователей из группы.источник
При выполнении производственной конфигурации я получил проблему с разрешением. Я попытался найти решение ниже.
Сообщение об ошибке
Решение: права доступа к сокету, указанные в сообщении об ошибке, /var/run/docker.sock:
После изменения разрешений для docket.sock выполните нижеприведенную команду для проверки разрешений.
источник
В моем случае было необходимо не только добавить
jenkins
пользователя вdocker
группу, но и сделать эту группу основной группойjenkins
пользователя.Не забудьте переподключить подчиненный узел jenkins или перезапустить сервер jenkins, в зависимости от вашего случая.
источник
2019-02-16
Большинство шагов были такими же для меня, как и другие. Однако я не смог добавить jenkins в групповой докер, используя usermod с упомянутыми решениями.
Я попробовал следующую команду с хоста докера и из запущенного контейнера докера :
(Я вошел в работающий докер-контейнер с помощью следующей команды с хоста докера :
)
Получено от хоста докера :
Получено из докера контейнера :
Я не знал пароль.
Без
sudo
части команды, в контейнере докера я получил:Решение: Я вошел в работающую Docker контейнер из Докер хоста с помощью следующей команды:
Теперь я вошел в систему как root и выдал следующую команду:
Затем с хоста докера я перезапустил свой работающий контейнер докера с помощью следующей команды:
После этого я начал работу Дженкинса, и она закончилась с успехом.
Я использовал только пользователя root для выдачи
usermod
команды для пользователяjenkins
.источник
2019-05-26
Это сработало для меня!
Пример docker-compose:
источник
Я сталкивался с подобной проблемой, которая является проблемой с разрешениями, и причина этой проблемы в том, что демон / сервер Docker всегда запускается как
root
пользователь и хочет, чтобы вы всегда вводили команду docker сsudo
.Демон Docker связывается с сокетом Unix вместо порта TCP. По умолчанию этот сокет Unix принадлежит пользователю,
root
и другие пользователи могут получить к нему доступ только с помощьюsudo
.Чтобы это исправить, вот что сработало для меня:
Во-первых, проверьте, если у вас уже есть группа докеров:
Если вы не найдете
docker
в списке, который отображается, вам нужно будет создать его:Затем подтвердите свои
user
и ваши сgroup
помощью команды ниже:Прокрутите, чтобы увидеть группу для докера. Это должно быть в этом формате
где
docker
мойgroup
иpromisepreston
мойuser
Теперь мы можем добавить вашего пользователя в группу Docker
Только для файлов контейнера Docker:
Скопируйте и запустите приведенную ниже команду в своем терминале в точности так, как она указана, не изменяя ее в любом случае, независимо от образа / контейнера / команды docker, которую вы хотите выполнить или пытаетесь выполнить, или она вызывает проблему с разрешениями:
После выполнения вышеуказанной команды вам нужно будет выйти из системы и снова войти в нее, чтобы вновь оценить членство в группе. Однако в Linux вы также можете запустить следующую команду ниже, чтобы активировать изменения в группах ( Скопируйте и запустите приведенную ниже команду в своем терминале в точности так, как указано, в любом случае не изменяя ее, независимо от образа / контейнера / команды docker, которая вы хотите запустить, или пытаетесь запустить, или вы видите проблему с разрешением ):
Теперь вы можете проверить, что вы можете запускать команды docker без разрешений sudo, выполнив команду, которая снова вызывает проблему с разрешениями, скажем ( Замените
my-command
на имя вашего образа / контейнера / команды ):Для файлов Docker и локальной файловой системы:
Если у вас есть копия файлов в локальной файловой системе, вы можете изменить владельца каталога приложения, в котором хранятся файлы приложения, используя этот формат:
Так что в моем случае это будет:
Примечание: Запустите эту команду внутри родительского каталога, в котором находится каталог приложения.
Вот и все.
надеюсь, это поможет
источник
источник
Я запускаю Дженкинса внутри докера. Самым простым решением для меня было создать собственное изображение, которое динамически устанавливает GID, например:
Смотрите: https://github.com/jenkinsci/docker/issues/263
В качестве альтернативы вы можете запустить jenkins со следующими параметрами:
Это предполагает, что на вашем образе jenkins установлен клиент Docker. Смотрите: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci
источник
Если вы можете получить ошибки, как показано ниже,
или
Просто попробуйте выполнить следующие команды,
источник
usermod -a -G docker jenkins
chown jenkins:docker /var/run/docker.sock
Я использую официальное изображение докера Дженкинса ( https://hub.docker.com/r/jenkins/jenkins ), но я думаю, что это решение применимо в большинстве случаев, когда мы хотим запустить Docker внутри контейнера Docker.
Рекомендованный способ использования Docker внутри контейнера Docker - это использование Docker хост-системы. Хорошая статья относительно этого: https://itnext.io/docker-in-docker-521958d34efd .
Секрет решения проблемы с разрешениями, о которой идет речь в этом вопросе, заключается в добавлении разрешений для пользователя контейнера внутри контейнера, а не хост-системы . Только пользователь root имеет права делать это по умолчанию, поэтому
сделаю это. Не забудьте перезапустить контейнер.
Я думаю, что самый простой способ добиться этого - создать настроенный Dockerfile:
источник
Если кто-то все еще сталкивается с проблемой на своем локальном компьютере (Ubuntu), попробуйте следующую команду:
источник
В моем случае это будет работать успешно. перейдите в локальный репо и введите эту команду.
источник
На сервере, где работает Jenkins, я использовал
А затем запустите каждый док-контейнер с
Использование setfacl кажется лучшим вариантом, и «-u user» не требуется. Затем контейнеры запускаются от имени того же пользователя, на котором работает Jenkins. Но я был бы признателен за любые отзывы экспертов по безопасности.
источник
используйте ниже dockerfile
источник
в моем случае это был только запуск службы Docker:
источник
часто требуется перезагрузка для вступления в силу новой группы пользователей и пользователя.
источник
Если вы запускаете Jenkins в док-контейнере, а ваш Jenkins связывается с хост-докером, то вы можете это исправить просто с помощью Dockerfile ниже:
источник
Возможно, вам стоит запустить докер с опцией "-u root" с самого начала
По крайней мере, это решило мою проблему
источник
root
. По крайней мере, так случилось со мной, с Docker 18.06.1.