Je suis nouveau au docker. Je viens d'essayer d'utiliser Docker sur ma machine locale (Ubuntu 16.04) avec Jenkins.
J'ai configuré un nouveau travail avec un 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.
L'utilisateur jenkins
doit être ajouté au groupe docker
:
Sudo usermod -a -G docker jenkins
Puis redémarrez Jenkins.
Mes premières solutions ont été:
usermod -aG docker jenkins
usermod -aG root jenkins
chmod 664 /var/run/docker.sock
Mais aucun d'eux ne fonctionne pour moi, j'ai essayé:
chmod 777 /var/run/docker.sock
Cela fonctionne, mais je ne sais pas si c'est le bon appel.
J'ai ajouté l'utilisateur jenkins au groupe racine et ai redémarré les jenkins et cela a commencé à fonctionner.
Sudo usermod -a -G root jenkins
Sudo service jenkins restart
Succès pour moi
Sudo usermod -a -G docker $USER
reboot
Jenkins tourne sous Docker et connecté Jenkins 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) Conteneur intérieur de Jenkins dans Docker (docker exec -it jenkins bash
sur la machine hôte)
usermod -a -G docker jenkins
chmod 664 /var/run/docker.sock
service jenkins restart (or systemctl restart jenkins.service)
su jenkins
2) Sur la machine hôte:
Sudo service docker restart
664
signifie - lire et écrire (mais pas exécuter) pour le propriétaire et les utilisateurs du groupe.
Simplement == ajoutant docker
en tant que groupe supplémentaire pour l'utilisateur jenkins
_Sudo usermod -a -G docker jenkins
_
n’est pas toujours suffisant lorsqu’on utilise une image Docker en tant que Agent Jenkins . Autrement dit, si votre Jenkinsfile
commence par _pipeline{agent{dockerfile
_ ou _pipeline{agent{image
_:
_pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
}
}
stages {
_
En effet, Jenkins exécute une commande docker run
, ce qui entraîne trois problèmes.
docker run
_ ne se connecte pas au conteneur (il s'agit plutôt d'un Sudo
).Rendre les programmes Docker disponibles dans l’image Docker nécessite simplement d’exécuter les étapes étapes d’installation de Docker dans votre fichier Docker:
_# Dockerfile.jenkinsAgent
FROM debian:stretch-backports
# Install Docker in the image, which adds a docker group
RUN apt-get -y update && \
apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
"deb [Arch=AMD64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
RUN apt-get -y update && \
apt-get -y install \
docker-ce \
docker-ce-cli \
containerd.io
...
_
Comme a déjà été dit , résoudre le deuxième problème signifie exécuter le conteneur Jenkins Docker afin de partager le socket du démon Docker avec le démon Docker qui est à l'extérieur le conteneur. Vous devez donc dire à Jenkins d’exécuter le conteneur Docker avec ce partage, ainsi:
_pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
args '-v /var/run/docker.sock:/var/run/docker.sock'
}
}
_
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 que je connaisse 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é attribués lors de l'exécution de _useradd ... jenkins
_ et _groupadd ... docker
_ lors de l'installation de Jenkins et de Docker sur l'hôte). Et vous ne pouvez pas simplement dire Jenkins à l'utilisateur jenkins
et au groupe docker
_args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
_
car que indique à Docker d'utiliser l'utilisateur et le groupe nommés jenkins
et docker
dans l'image , et votre image Docker n'a probablement pas l'utilisateur et le groupe jenkins
, et même si elle le faisait , il n'y aurait aucune garantie qu'il aurait le même UID et le même GID que l'hôte, et là De même, rien ne garantit que le docker
GID est le même.
Heureusement, Jenkins exécute la commande _docker build
_ pour votre fichier Docker dans un script. Vous pouvez donc utiliser la magie du script Shell pour transmettre ces informations sous forme d'arguments de génération Docker:
_pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
additionalBuildArgs '--build-arg JENKINSUID=`id -u jenkins` --build-arg JENKINSGID=`id -g jenkins` --build-arg DOCKERGID=`stat -c %g /var/run/docker.sock`'
args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
}
}
_
Qui utilise la commande id
pour obtenir le UID et GID de l'utilisateur jenkins
et le stat
commande pour obtenir des informations sur le socket Docker.
Votre fichier Docker peut utiliser ces informations pour configurer un utilisateur jenkins
et un groupe docker
pour l'agent, à l'aide de groupadd
, groupmod
et useradd
:
_# Dockerfile.jenkinsAgent
FROM debian:stretch-backports
ARG JENKINSUID
ARG JENKINSGID
ARG DOCKERGID
...
# Install Docker in the image, which adds a docker group
RUN apt-get -y update && \
apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
"deb [Arch=AMD64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
RUN apt-get -y update && \
apt-get -y install \
docker-ce \
docker-ce-cli \
containerd.io
...
# Setup users and groups
RUN groupadd -g ${JENKINSGID} jenkins
RUN groupmod -g ${DOCKERGID} docker
RUN useradd -c "Jenkins user" -g ${JENKINSGID} -G ${DOCKERGID} -M -N -u ${JENKINSUID} jenkins
_
2019-05-26
This a fonctionné pour moi!
Exemple docker-compose:
version: "3"
services:
jenkins:
image: jenkinsci/blueocean
privileged: true
ports:
- "8080:8080"
volumes:
- $HOME/learning/jenkins/jenkins_home:/var/jenkins_home
environment:
- DOCKER_Host=tcp://socat:2375
links:
- socat
socat:
image: bpack/socat
command: TCP4-LISTEN:2375,fork,reuseaddr UNIX-CONNECT:/var/run/docker.sock
volumes:
- /var/run/docker.sock:/var/run/docker.sock
expose:
- "2375"
Sudo usermod -a -G docker jenkins
Sudo service jenkins restart
2019-02-16
La plupart des étapes étaient les mêmes pour moi que les autres l'ont écrit . Cependant, je n'ai pas pu ajouter de jenkins au groupe de docker en utilisant usermod avec les solutions mentionnées.
J'ai essayé la commande suivante depuis le hôte docker et le conteneur docker en cours d'exécution:
Sudo usermod -a -G docker jenkins
(Je suis entré dans le conteneur docker en cours d'exécution} avec la commande suivante de l'hôte hôte docker:
docker exec -t -i my_container_id_or_name /bin/bash
)
Reçu de hôte de menu fixe:
usermod: l'utilisateur 'jenkins' n'existe pas
Reçu de conteneur de menu fixe:
Nous espérons que vous avez reçu la conférence habituelle du système local Administrateur. Cela se résume généralement à ces trois choses:
#1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility.
[Sudo] mot de passe pour Jenkins:
Je ne connaissais pas le mot de passe.
Sans la partie Sudo
de la commande, dans le conteneur docker j'ai reçu:
usermod: permission refusée. usermod: ne peut pas verrouiller/etc/passwd; essayer encore plus tard.
Solution: Je suis entré dans le conteneur docker en cours d'exécution à partir du hôte docker avec la commande suivante:
docker exec -t -i -u root my_container_id_or_name /bin/bash
Maintenant, je suis entré en tant que root , et j'ai lancé la commande suivante:
usermod -a -G docker jenkins
Ensuite, à partir de hôte de menu fixe, j'ai redémarré mon conteneur de menu fixe en cours d'exécution avec la commande suivante:
docker restart my_container_id_or_name
Après cela, j’ai commencé le travail de Jenkins et c’est fini avec succès.
J'ai seulement utilisé le root user pour émettre la commande usermod
pour l'utilisateur jenkins
.
Découvrez cette image de docker que j'ai créée pour utiliser Jenkins avec docker . https://hub.docker.com/r/fristonio/jenkins_docker/
Lisez les instructions sur l'utilisation. Aussi, vous pouvez jeter un oeil au fichier Dockerfile ici
Sur le serveur où Jenkins est en cours d'exécution, j'ai utilisé
Sudo setfacl -m user:Tomcat:rw /var/run/docker.sock
Et puis exécutez chaque conteneur de docker avec
-v /var/run/docker.sock:/var/run/docker.sock
Utiliser setfacl semble être une meilleure option, et aucun "utilisateur -u" n'est nécessaire. Les conteneurs s'exécutent alors sous le même utilisateur que Jenkins. Mais j'apprécierais tout retour des experts en sécurité.
Dans mon cas, il était non seulement nécessaire d'ajouter l'utilisateur jenkins
au groupe docker
, mais également de faire de ce groupe le groupe principal de l'utilisateur jenkins
.
# usermod -g docker jenkins
# usermod -a -G jenkins jenkins
N'oubliez pas de reconnecter le nœud esclave jenkins ou de redémarrer le serveur jenkins, selon votre cas.