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
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:
-
Usted monta el socket
/var/run/docker.sock
en el contenedor jenkins para poder usar el docker desde el host. - 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
-
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 unsudo
).
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