with tutorial plugin hub create compose docker jenkins jenkins-pipeline

tutorial - Se le denegó el permiso al intentar conectarse al socket del demonio Docker en unix:///var/run/docker.sock



jenkins docker tutorial (12)

Éxito para mi

sudo usermod -a -G docker $USER reboot

Soy nuevo en Docker. Intenté usar Docker en mi máquina local (Ubuntu 16.04) con Jenkins.

Configuré un nuevo trabajo con el siguiente script de canalización.

node { stage(''Build'') { docker.image(''maven:3.3.3'').inside { sh ''mvn --version'' } } }

Pero falla con el siguiente error.


Agregué el usuario jenkins al grupo raíz y reinicié el jenkins y comenzó a funcionar.

sudo usermod -a -G root jenkins sudo service jenkins restart


El usuario jenkins debe agregarse a la docker grupo:

sudo usermod -a -G docker jenkins

Luego reinicie Jenkins.

Editar

Si llega a esta pregunta de desbordamiento de pila porque recibe este mensaje de Docker, pero no utiliza jenkins, lo más probable es que el error sea el mismo: su usuario no privilegiado no pertenece al grupo de Docker.

Tu puedes hacer:

sudo usermod -a -G docker alice

o sea cual sea tu nombre de usuario.

Puede verificarlo al final haciendo cat /etc/group y ver algo así:

docker:x:998:alice

en una de las lineas.

Como dice Ilya Kolesnikov en el comentario, ¡vuelva a iniciar sesión!


En mi caso, no solo era necesario agregar el usuario jenkins al grupo de docker , sino que convertir ese grupo en el grupo principal del usuario jenkins .

# usermod -g docker jenkins # usermod -a -G jenkins jenkins

No olvide volver a conectar el nodo esclavo jenkins o reiniciar el servidor jenkins, según su caso.


Mis primeras soluciones fueron:

usermod -aG docker jenkins usermod -aG root jenkins chmod 664 /var/run/docker.sock

Pero ninguno de ellos funciona para mí, intenté:

chmod 777 /var/run/docker.sock

Eso funciona, pero no sé si es la decisión correcta.


Tal vez deberías ejecutar la ventana acoplable con la opción "-u root" desde el principio

Al menos eso resolvió mi problema


Tengo a Jenkins ejecutándose en Docker y Jenkins conectado está usando el socket Docker desde la máquina host Ubuntu 16.04 a través del volumen a /var/run/docker.sock.

Para mí la solución fue:

1) Dentro del contenedor Docker de Jenkins ( docker exec -it jenkins bash en la máquina host)

usermod -a -G docker jenkins chmod 664 /var/run/docker.sock service jenkins restart (or systemctl restart jenkins.service) su jenkins

2) En la máquina host:

sudo service docker restart

664 significa: leer y escribir (pero no ejecutar) para el propietario y los usuarios del grupo.


2018-08-19

He estado atrapado durante días en este caso y, como no he encontrado una respuesta completa con el por qué y cómo, publicaré una para otras personas que tropiezan con el mismo problema y las respuestas de arriba no funcionan.

Estos son los 3 pasos cruciales al ejecutar Jenkins dentro de la ventana acoplable:

  1. Usted monta el socket /var/run/docker.sock en el contenedor jenkins para poder usar el docker desde el host.
  2. Debe instalar la ventana acoplable dentro del contenedor para poder usarlo. This es un excelente y simple artículo sobre cómo hacerlo. Tenga en cuenta que es posible que las versiones más recientes ya tengan docker instalado
  3. sudo usermod -a -G docker jenkins para agregar jenkins al grupo de docker. Sin embargo, aquí puede encontrar un problema de permisos si la ventana acoplable del host y la ventana acoplable del contenedor no tienen la misma identificación de grupo, por lo que es muy importante ajustar el gid del acoplador del contenedor para que sea el mismo que el gid del acoplador del host

Puede hacerlo como parte de un script de inicio o simplemente usando exec y haciéndolo manualmente: groupmod -g <YOUR_HOST_DOCKER_GID> docker .

Además, no cambie los permisos de /var/run/docker.sock a 777 o cosas por el estilo porque es un gran riesgo de seguridad.

Espero que esto ayude


2019-02-16

La mayoría de los pasos fueron los mismos para mí que los otros han escrito. Sin embargo, no pude agregar jenkins al acoplador de grupo usando usermod con las soluciones mencionadas.

Intenté el siguiente comando desde el host de Docker y desde el contenedor de Docker en ejecución :

sudo usermod -a -G docker jenkins

( Ingresé al contenedor de Docker en ejecución con el siguiente comando del host de Docker :

docker exec -t -i my_container_id_or_name /bin/bash

)

Recibido del host docker :

usermod: el usuario ''jenkins'' no existe

Recibido del contenedor acoplable :

Confiamos en que haya recibido la conferencia habitual del administrador del sistema local. Por lo general, se reduce a estas tres cosas:

#1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility.

[sudo] contraseña para jenkins:

No sabía la contraseña.

Sin la parte sudo del comando, en el contenedor docker recibí:

usermod: permiso denegado. usermod: no puede bloquear / etc / passwd; intente nuevamente más tarde.

Solución: Ingresé al contenedor de Docker en ejecución desde el host de Docker con el siguiente comando:

docker exec -t -i -u root my_container_id_or_name /bin/bash

Ahora, ingresé como root y emití el siguiente comando:

usermod -a -G docker jenkins

Luego, desde el host Docker , reinicié mi contenedor Docker en ejecución con el siguiente comando:

docker restart my_container_id_or_name

Después de eso, comencé el trabajo de jenkins y terminó con éxito.

Solo utilicé el usuario root para emitir el comando usermod para el usuario jenkins .


2019-05-26

This funcionó para mí!

Ejemplo de 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"


Simply agregando docker como un grupo suplementario para el usuario jenkins

sudo usermod -a -G docker jenkins

no siempre es suficiente cuando se usa una imagen Docker como el Agente Jenkins . Es decir, si su Jenkinsfile comienza con pipeline{agent{dockerfile o pipeline{agent{image : pipeline{agent{image :

pipeline { agent { dockerfile { filename ''Dockerfile.jenkinsAgent'' } } stages {

Esto se debe a que Jenkins ejecuta un comando de docker run , lo que resulta en tres problemas.

  • El Agente (probablemente) no tendrá instalados los programas Docker.
  • El agente no tendrá acceso al socket del demonio Docker, por lo que intentará ejecutar Docker-in-Docker, lo que no se recomienda .
  • Jenkins proporciona el ID de usuario numérico y el ID de grupo numérico que el Agente debe usar. El agente no tendrá ningún grupo suplementario, porque la docker run no inicia sesión en el contenedor (es más como un sudo ).

Instalación de Docker para el agente

Hacer que los programas Docker estén disponibles dentro de la imagen Docker simplemente requiere ejecutar los pasos de instalación de Docker en su Dockerfile:

# 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 ...

Compartir el socket del demonio Docker

Como se ha dicho antes , solucionar el segundo problema significa ejecutar el contenedor Docker de Jenkins para que comparta el socket del demonio Docker con el demonio Docker que está fuera del contenedor. Por lo tanto, debe decirle a Jenkins que ejecute el contenedor Docker con ese intercambio, por lo tanto:

pipeline { agent { dockerfile { filename ''Dockerfile.jenkinsAgent'' args ''-v /var/run/docker.sock:/var/run/docker.sock'' } }

Configuración de UID y GID

La solución ideal para el tercer problema sería establecer grupos suplementarios para el Agente. Eso no parece posible. La única solución que conozco es ejecutar el Agente con el UID de Jenkins y el Docker GID (el socket tiene permiso de escritura grupal y es propiedad de root.docker ). Pero en general, no sabe cuáles son esos ID (se asignaron cuando useradd ... jenkins y groupadd ... docker ejecutó cuando Jenkins y Docker se instalaron en el host). Y no puede simplemente decirle a Jenkins que jenkins usuario jenkins y el docker grupal

args ''-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker''

porque eso le dice a Docker que use el usuario y el grupo que se denominan jenkins y docker dentro de la imagen , y su imagen de Docker probablemente no tenga el usuario y el grupo de jenkins , e incluso si lo tuviera no habría garantía de que tuviera el mismo UID y GID como el host, y tampoco hay garantía de que el docker GID sea el mismo

Afortunadamente, Jenkins ejecuta el comando de docker build de Docker para su Dockerfile en un script, por lo que puede hacer algo de magia de script de shell para pasar esa información a medida que Docker construye argumentos:

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'' } }

Utiliza el comando id para obtener el UID y el GID del usuario jenkins y el comando stat para obtener información sobre el socket Docker.

Su Dockerfile puede usar esa información para configurar un usuario de jenkins y un grupo de docker para el Agente, usando groupadd , groupmod y 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


sudo usermod -a -G docker jenkins sudo service jenkins restart