Je suis nouveau dans docker. J'ai juste essayé d'utiliser docker sur ma machine locale (Ubuntu 16.04) avec Jenkins.
J'ai configuré un nouveau travail avec le script de pipeline ci-dessous.
node {
stage('Build') {
docker.image('maven:3.3.3').inside {
sh 'mvn --version'
}
}
}
Mais cela échoue avec l'erreur ci-dessous.
docker
jenkins
jenkins-pipeline
Ponsuyambu Velladurai
la source
la source
Réponses:
L'utilisateur
jenkins
doit être ajouté au groupedocker
:Puis redémarrez Jenkins.
Éditer
Si vous arrivez à cette question de débordement de pile parce que vous recevez ce message de docker, mais que vous n'utilisez pas jenkins, l'erreur est très probablement la même: votre utilisateur non privilégié n'appartient pas au groupe docker.
Tu peux faire:
ou quel que soit votre nom d'utilisateur.
Vous pouvez le vérifier à la fin en faisant
grep docker /etc/group
et voir quelque chose comme ceci:dans l'une des lignes.
Modifiez ensuite votre ID de groupe d'utilisateurs en
docker
:la source
sudo usermod -a -G docker $USER
et déconnecter ou redémarrer. liennewgrp docker
place dans la même session de terminal.Mes premières solutions ont été:
Mais aucun d'entre eux ne fonctionne pour moi, j'ai essayé:
Cela fonctionne, mais je ne sais pas si c'est le bon choix.
la source
docker.sock
fichier n'est pas la meilleure solution, il vous suffit d'exécuter lesusermod
instructions ..., puis de redémarrer votre système, sinon cela ne prend pas effetSuccès pour moi
la source
2018-08-19
Je suis coincé depuis des jours sur celui-ci et comme je n'ai pas trouvé de réponse complète avec le pourquoi et le comment, je vais en publier une pour d'autres personnes qui trébuchent sur le même problème et les réponses d'en haut ne fonctionnent pas.
Voici les 3 étapes cruciales lors de l'exécution de Jenkins à l'intérieur de docker:
/var/run/docker.sock
sur le conteneur jenkins afin de pouvoir utiliser le docker de l'hôte.sudo usermod -a -G docker jenkins
pour ajouter jenkins au groupe docker. Cependant, ici, vous pouvez rencontrer un problème d'autorisation si le docker hôte et le docker du conteneur n'ont pas le même identifiant de groupe, il est donc très important d'ajuster le gid du docker du conteneur pour qu'il soit le même que le gid du docker hôteVous pouvez le faire dans le cadre d'un script de lancement ou simplement en l'utilisant
exec
et en le faisant manuellement:groupmod -g <YOUR_HOST_DOCKER_GID> docker
.De plus, ne modifiez pas les autorisations du
/var/run/docker.sock
à 777 ou des trucs comme ça, car c'est un gros risque pour la sécurité, vous donnez fondamentalement à tout le monde permission d'utiliser docker sur votre machine.J'espère que cela t'aides
la source
J'ai ajouté l'utilisateur jenkins au groupe racine et redémarré les jenkins et cela a commencé à fonctionner.
la source
Modifier l'autorisation d'accès du fichier docker.sock
ou vous pouvez utiliser
sudo
au début de la commande.chmod 777
autorisera toutes les actions pour tous les utilisateurs tandis quechmod 666
permettra à tous les utilisateurs de lire et d'écrire mais ne pourra pas exécuter le fichier.la source
Ajout simplement
docker
comme groupe supplémentaire pour l'jenkins
utilisateurn'est pas toujours suffisant lors de l'utilisation d'une image Docker comme agent Jenkins . Autrement dit, si vous
Jenkinsfile
commencez parpipeline{agent{dockerfile
oupipeline{agent{image
:C'est parce que Jenkins exécute une
docker run
commande, ce qui entraîne trois problèmes.docker run
ne se connecte pas au conteneur (c'est plus comme asudo
).Installation de Docker pour l'agent
Pour rendre les programmes Docker disponibles dans l'image Docker, il suffit d'exécuter les étapes d'installation de Docker dans votre Dockerfile:
Partage du socket du démon Docker
Comme cela a été dit précédemment , résoudre le deuxième problème signifie exécuter le conteneur Jenkins Docker afin qu'il partage le socket du démon Docker avec le démon Docker qui se trouve à l' extérieur du conteneur. Vous devez donc dire à Jenkins d'exécuter le conteneur Docker avec ce partage, ainsi:
Définition des UID et des GID
La solution idéale au troisième problème serait de configurer des groupes supplémentaires pour l'agent. Cela ne semble pas possible. Le seul correctif dont j'ai connaissance est d'exécuter l'agent avec l'UID Jenkins et le GID Docker (le socket a l'autorisation d'écriture de groupe et appartient à
root.docker
). Mais en général, vous ne savez pas quels sont ces ID (ils ont été alloués lorsqueuseradd ... jenkins
etgroupadd ... docker
exécutés lorsque Jenkins et Docker ont été installés sur l'hôte). Et vous ne pouvez pas simplement dire Jenkins à l'utilisateurjenkins
et au groupedocker
car cela indique à Docker d'utiliser l'utilisateur et le groupe qui sont nommés
jenkins
etdocker
dans l'image , et votre image Docker n'a probablement pas l'jenkins
utilisateur et le groupe, et même si c'était le cas, il n'y aurait aucune garantie qu'elle aurait le même UID et GID que l'hôte, et il n'y a pas non plus de garantie que ledocker
GID est le mêmeHeureusement, Jenkins exécute la
docker build
commande pour votre Dockerfile dans un script, vous pouvez donc faire de la magie de script shell pour transmettre ces informations en tant qu'arguments de construction Docker:Cela utilise la
id
commande pour obtenir l' UID et le GID de l'jenkins
utilisateur et lastat
commande pour obtenir des informations sur le socket Docker.Votre Dockerfile peut utiliser ces informations pour configurer un
jenkins
utilisateur etdocker
groupe pour l'agent, en utilisantgroupadd
,groupmod
etuseradd
:la source
-u jenkins:$(getent group docker | cut -d: -f3)
?args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
enargs '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:jenkins --group-add docker'
passant -u jenkins: docker, vous changez le groupe d'utilisateurs principal, ce qui signifie que lorsque l'utilisateur écrit un fichier, disons dans l'espace de travail, il définira le fichier l'utilisateur de jenkins et le groupe de docker. Ce n'est probablement pas ce que nous entendons.Jenkins fonctionne dans Docker et Jenkins connecté utilise le socket Docker de la machine hôte Ubuntu 16.04 via le volume vers /var/run/docker.sock.
Pour moi, la solution était:
1) À l'intérieur du conteneur Docker de Jenkins (
docker exec -it jenkins bash
sur la machine hôte)2) Sur la machine hôte:
664
signifie - lire et écrire (mais pas exécuter) pour le propriétaire et les utilisateurs du groupe.la source
Tout en faisant la configuration de production, j'ai eu le problème d'autorisation.J'ai essayé la solution ci-dessous pour résoudre le problème.
Message d'erreur
Solution: autorisations du socket indiqué dans le message d'erreur, /var/run/docker.sock:
Après avoir modifié l'autorisation pour docket.sock, exécutez la commande ci-dessous pour vérifier les autorisations.
la source
Dans mon cas, il était non seulement nécessaire d'ajouter un
jenkins
utilisateur audocker
groupe, mais de faire de ce groupe le groupe principal de l'jenkins
utilisateur.N'oubliez pas de reconnecter le nœud esclave jenkins ou de redémarrer le serveur jenkins, selon votre cas.
la source
16/02/2019
La plupart des étapes étaient les mêmes pour moi que les autres l'ont écrit. Cependant, je n'ai pas pu ajouter jenkins au docker de groupe en utilisant usermod avec les solutions mentionnées.
J'ai essayé la commande suivante à partir de l' hôte docker et du conteneur docker en cours d'exécution :
(Je suis entré dans le conteneur docker en cours d'exécution avec la commande suivante à partir de l' hôte docker :
)
Reçu de l' hôte docker :
Reçu du conteneur docker :
Je ne connaissais pas le mot de passe.
Sans la
sudo
partie de la commande, dans le conteneur docker, j'ai reçu:Solution: je suis entré dans le conteneur docker en cours d'exécution à partir de l' hôte docker avec la commande suivante:
Maintenant, je suis entré en tant que root et j'ai émis la commande suivante:
Ensuite, à partir de l' hôte docker , j'ai redémarré mon conteneur docker en cours d'exécution avec la commande suivante:
Après cela, j'ai commencé le travail de Jenkins et cela s'est terminé avec succès.
Je n'ai utilisé que l' utilisateur root pour émettre la
usermod
commande pour l'utilisateurjenkins
.la source
26/05/2019
Cela a fonctionné pour moi!
Exemple de docker-compose:
la source
J'ai rencontré un problème similaire, qui est un problème d'autorisation et la cause de ce problème est que le démon / serveur Docker s'exécute toujours en tant
root
qu'utilisateur et souhaite que vous préfacriez toujours la commande docker avecsudo
.Le démon Docker se lie à un socket Unix au lieu d'un port TCP. Par défaut, le socket Unix appartient à l'utilisateur
root
et les autres utilisateurs ne peuvent y accéder qu'en utilisantsudo
.Pour résoudre ce problème, voici ce qui a fonctionné pour moi:
Tout d'abord, vérifiez si vous avez déjà créé un groupe de dockers:
Si vous ne trouvez pas
docker
dans la liste qui s'affiche, vous devrez en créer une:Ensuite, confirmez votre
user
et votre engroup
utilisant la commande ci-dessous:Faites défiler pour voir le groupe pour le menu fixe. Il devrait être de ce format
où
docker
est mongroup
etpromisepreston
est monuser
Nous pouvons maintenant ajouter votre utilisateur au groupe Docker
Pour les fichiers de conteneur Docker uniquement:
Copiez et exécutez la commande ci-dessous dans votre terminal exactement comme elle est indiquée sans la modifier de toute façon, quelle que soit l'image / le conteneur / la commande du docker que vous souhaitez exécuter ou que vous essayez d'exécuter ou qui cause le problème d'autorisation:
Après avoir exécuté la commande ci-dessus, vous devrez vous déconnecter et vous reconnecter afin que votre appartenance au groupe soit réévaluée. Cependant, sous Linux, vous pouvez également exécuter la commande suivante ci-dessous pour activer les modifications apportées aux groupes ( Copiez et exécutez la commande ci-dessous dans votre terminal exactement comme elle est indiquée sans la modifier de toute façon, quelle que soit l'image / conteneur / commande du docker qui vous souhaitez exécuter ou essayez d'exécuter ou est en train de casse le problème d'autorisation ):
Vous pouvez maintenant vérifier que vous pouvez exécuter des commandes docker sans autorisations sudo, en exécutant à nouveau la commande à l'origine du problème d'autorisations, par exemple ( remplacez
my-command
par le nom de votre image / conteneur / commande ):Pour les fichiers Docker et du système de fichiers local:
Si vous disposez d'une copie des fichiers sur votre système de fichiers local, vous pouvez modifier la propriété du répertoire d'application dans lequel les fichiers d'application sont stockés, en utilisant ce format:
Donc dans mon cas ce sera:
Remarque: veuillez exécuter cette commande dans le répertoire parent contenant le répertoire de l'application.
C'est tout.
J'espère que ça aide
la source
la source
J'exécute Jenkins dans un conteneur docker. La solution la plus simple pour moi était de créer une image personnalisée qui définit dynamiquement le GID, comme:
Voir: https://github.com/jenkinsci/docker/issues/263
Vous pouvez également lancer jenkins avec les options suivantes:
Cela suppose que votre image jenkins a un client docker installé. Voir: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci
la source
Si vous pouvez obtenir des erreurs comme ci-dessous,
ou
Essayez simplement d'exécuter les commandes suivantes,
la source
usermod -a -G docker jenkins
etchown jenkins:docker /var/run/docker.sock
I`m en utilisant l' officiel image jenkins docker ( https://hub.docker.com/r/jenkins/jenkins ) mais je pense que cette solution est applicable à la plupart des cas d'utilisation où nous voulons exécuter Docker dans un conteneur Docker.
La méthode recommandée pour utiliser Docker dans un conteneur Docker consiste à utiliser le démon Docker du système hôte. Bon article à ce sujet: https://itnext.io/docker-in-docker-521958d34efd .
Le secret pour gérer le problème d'autorisation, sur lequel porte cette question, est d'ajouter des autorisations pour l'utilisateur du conteneur à l'intérieur du conteneur, et non pour le système hôte . Seul l'utilisateur root a l'autorisation de le faire par défaut, donc
le fera. N'oubliez pas de redémarrer le conteneur.
Je suppose que le moyen le plus simple d'y parvenir est de créer un Dockerfile personnalisé:
la source
Si quelqu'un est toujours confronté au problème sur sa machine locale (Ubuntu), essayez la commande ci-dessous:
la source
Dans mon cas, cela fonctionnera avec succès. naviguez dans votre dépôt local et entrez cette commande.
la source
Sur le serveur sur lequel s'exécute Jenkins, j'ai utilisé
Et puis exécutez chaque conteneur docker avec
Utiliser setfacl semble une meilleure option, et aucun "utilisateur -u" n'est nécessaire. Les conteneurs s'exécutent ensuite sous le même utilisateur que celui qui exécute Jenkins. Mais j'apprécierais les commentaires des experts en sécurité.
la source
utiliser ci-dessous dockerfile
la source
dans mon cas, il s'agissait juste de démarrer le service docker:
la source
ont souvent besoin d'un redémarrage pour prendre effet sur le nouveau groupe d'utilisateurs et l'utilisateur.
la source
Si vous exécutez Jenkins dans un conteneur docker et que votre Jenkins est lié au docker hôte, vous pouvez résoudre ce problème uniquement par le Dockerfile ci-dessous:
la source
Peut-être devriez-vous lancer le docker avec l'option "-u root" depuis le tout début
Au moins ça a résolu mon problème
la source
root
. Au moins, c'est ce qui m'est arrivé, avec Docker 18.06.1.