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.
docker
jenkins
jenkins-pipeline
Ponsuyambu Velladurai
fuente
fuente
Respuestas:
El usuario
jenkins
debe ser agregado al grupodocker
: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:
o sea cual sea tu nombre de usuario.
Puede verificarlo al final
grep docker /etc/group
y ver algo como esto:en una de las lineas.
Luego cambie su ID de grupo de usuarios a
docker
:fuente
sudo usermod -a -G docker $USER
y cerrar sesión o reiniciar. enlacenewgrp docker
en su lugar en la misma sesión de terminal.Mis primeras soluciones fueron:
Pero ninguno de ellos funciona para mí, intenté:
Eso funciona, pero no sé si es la decisión correcta.
fuente
docker.sock
archivo no es la mejor solución, solo necesita ejecutar lasusermod
... instrucciones y luego reiniciar su sistema, de lo contrario no tendrá efectoÉxito para mi
fuente
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:
/var/run/docker.sock
en el contenedor jenkins para poder usar el acoplador desde el host.sudo usermod -a -G docker jenkins
para agregar jenkins al grupo de acopladores. Sin embargo, aquí puede encontrar un problema de permisos si la ventana acoplable de host y la ventana acoplable de contenedor no tienen la misma identificación de grupo, por lo que es muy importante ajustar el gid de docker del contenedor para que sea el mismo que el gid de docker de hostPuede hacer esto como parte de un script de inicio o simplemente usándolo
exec
y haciéndolo manualmente:groupmod -g <YOUR_HOST_DOCKER_GID> docker
.Además, no cambie los permisos del
/var/run/docker.sock
777 o cosas por el estilo, ya que es un gran riesgo de seguridad, básicamente le está dando a todos permiso a para usar Docker en su máquinaEspero que esto ayude
fuente
Agregué el usuario jenkins al grupo raíz y reinicié el jenkins y comenzó a funcionar.
fuente
Cambiar el permiso de acceso del archivo docker.sock
o puede usar
sudo
al comienzo del comando.chmod 777
permitirá todas las acciones para todos los usuarios, mientraschmod 666
que permitirá a todos los usuarios leer y escribir, pero no puede ejecutar el archivo.fuente
Simplemente agregando
docker
como un grupo suplementario para eljenkins
usuariono siempre es suficiente cuando se usa una imagen Docker como el Agente Jenkins . Es decir, si
Jenkinsfile
comienza conpipeline{agent{dockerfile
opipeline{agent{image
:Esto se debe a que Jenkins ejecuta un
docker run
comando, lo que resulta en tres problemas.docker run
que 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:
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:
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 GID de Docker (el socket tiene permiso de escritura grupal y es propiedad de
root.docker
). Pero, en general, no sabe cuáles son esas identificaciones son (fueron asignados cuando eluseradd ... jenkins
ygroupadd ... docker
corrió cuando Jenkins y estibador se han instalado en el host). Y no puede simplemente decirle a Jenkins que use usuariojenkins
y grupodocker
porque eso le dice a Docker que use el usuario y el grupo que están nombrados
jenkins
ydocker
dentro de la imagen , y su imagen de Docker probablemente no tenga eljenkins
usuario y el grupo, e incluso si lo tuviera, no habría garantía de que tendría el mismo UID y GID que el host, y tampoco hay garantía de que eldocker
GID sea el mismoAfortunadamente, Jenkins ejecuta el
docker build
comando 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:Que utiliza el
id
comando para obtener el UID y GID deljenkins
usuario y elstat
comando para obtener información sobre el zócalo Docker.Su Dockerfile puede utilizar esa información para configurar un
jenkins
usuario odocker
grupo para el agente, usandogroupadd
,groupmod
yuseradd
:fuente
-u jenkins:$(getent group docker | cut -d: -f3)
?args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
alargs '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:jenkins --group-add docker'
pasar -u jenkins: docker, cambia el grupo de usuarios primario, lo que significa que cuando el usuario escribe un archivo, digamos en el espacio de trabajo, establecerá el archivo usuario a jenkins y el grupo a docker. Lo cual probablemente no sea lo que pretendemos.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)2) En la máquina host:
664
significa: leer y escribir (pero no ejecutar) para el propietario y los usuarios del grupo.fuente
Mientras hacía la configuración de producción, recibí el problema de permiso. Intenté la siguiente solución para resolver el problema.
Mensaje de error
Solución: permisos del socket indicado en el mensaje de error, /var/run/docker.sock:
Después de cambiar el permiso para docket.sock, ejecute el siguiente comando para verificar los permisos.
fuente
En mi caso, no solo era necesario agregar un
jenkins
usuario aldocker
grupo, sino que ese grupo era el grupo principal deljenkins
usuario.No olvide volver a conectar el nodo esclavo jenkins o reiniciar el servidor jenkins, según su caso.
fuente
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 :
( Ingresé al contenedor de Docker en ejecución con el siguiente comando del host de Docker :
)
Recibido del host docker :
Recibido del contenedor acoplable :
No sabía la contraseña.
Sin la
sudo
parte del comando, en el contenedor docker que recibí:Solución: entré al contenedor ventana acoplable funcionamiento del anfitrión ventana acoplable con el siguiente comando:
Ahora, ingresé como root y emití el siguiente comando:
Luego, desde el host Docker , reinicié mi contenedor Docker en ejecución con el siguiente comando:
Después de eso, comencé el trabajo de jenkins y terminó con éxito.
Solo utilicé el usuario raíz para emitir el
usermod
comando para el usuariojenkins
.fuente
2019-05-26
¡Esto funcionó para mí!
Ejemplo de docker-compose:
fuente
Me enfrenté a un problema similar, que es un problema de permisos y la causa de este problema se debe a que el demonio / servidor Docker siempre se ejecuta como el
root
usuario, y quiere que siempre introduzca el comando dockersudo
.Docker daemon se une a un socket Unix en lugar de un puerto TCP. Por defecto, el socket Unix es propiedad del usuario
root
y otros usuarios solo pueden acceder a él usandosudo
.Para solucionar esto, esto es lo que funcionó para mí:
En primer lugar, verifique si ya ha creado un grupo de acopladores:
Si no encuentra
docker
en la lista que se muestra, deberá crear uno:A continuación, confirme su
user
y sugroup
utilizando el siguiente comando:Desplácese para ver el grupo de Docker. Debe ser de este formato.
dónde
docker
esta migroup
ypromisepreston
es miuser
Ahora podemos agregar su usuario al grupo acoplable
Solo para archivos de contenedor Docker:
Copie y ejecute el siguiente comando en su terminal exactamente como se indica sin modificarlo de ninguna manera, independientemente de la imagen / contenedor / comando de la ventana acoplable que desea ejecutar o está intentando ejecutar o está causando el problema de permiso:
Después de ejecutar el comando anterior, deberá cerrar sesión y volver a iniciarla para que su membresía de grupo sea reevaluada. Sin embargo, en Linux, también puede ejecutar el siguiente comando a continuación para activar los cambios en los grupos ( Copie y ejecute el siguiente comando en su terminal exactamente como se indica sin modificarlo de ninguna manera, independientemente de la imagen / contenedor / comando del acoplador que desea ejecutar o está intentando ejecutar o está causando problemas de permisos ):
Ahora puede verificar que puede ejecutar comandos de Docker sin permisos de sudo, ejecutando el comando que está causando el problema de permisos nuevamente, diga ( Reemplazar
my-command
con el nombre de su imagen / contenedor / comando ):Para los archivos del sistema de archivos Docker y Local:
Si tiene una copia de los archivos en su sistema de archivos local, puede cambiar la propiedad del directorio de la aplicación donde se almacenan los archivos de la aplicación, utilizando este formato:
Entonces en mi caso será:
Nota: ejecute este comando dentro del directorio principal que contiene el directorio de la aplicación.
Eso es todo.
espero que esto ayude
fuente
fuente
Estoy ejecutando Jenkins dentro de un contenedor acoplable. La solución más simple para mí fue hacer una imagen personalizada que establezca dinámicamente el GID, como:
Ver: https://github.com/jenkinsci/docker/issues/263
Alternativamente, puede iniciar jenkins con las siguientes opciones:
Esto supone que su imagen jenkins tiene instalado el cliente Docker. Ver: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci
fuente
Si puede obtener errores como a continuación,
o
Solo intenta ejecutar los siguientes comandos,
fuente
usermod -a -G docker jenkins
ychown jenkins:docker /var/run/docker.sock
Estoy usando la imagen oficial de jenkins docker ( https://hub.docker.com/r/jenkins/jenkins ) pero creo que esta solución es aplicable a la mayoría de los casos de uso en los que queremos ejecutar Docker dentro de un contenedor Docker.
La forma recomendada para usar Docker dentro de un contenedor Docker es usar el demonio Docker del sistema host. Buen artículo al respecto: https://itnext.io/docker-in-docker-521958d34efd .
El secreto para manejar el problema de los permisos, del que trata esta pregunta, es agregar permisos para el usuario del contenedor dentro del contenedor, no para el sistema host . Solo el usuario root tiene permisos para hacerlo de forma predeterminada, por lo que
lo haré. Recuerde reiniciar el contenedor.
Supongo que la forma más sencilla de lograr esto es crear un Dockerfile personalizado:
fuente
Si alguien aún enfrenta el problema en su máquina local (Ubuntu), intente con el siguiente comando:
fuente
En mi caso, esto funcionará con éxito. navegue por su repositorio local e ingrese este comando.
fuente
En el servidor donde se ejecuta Jenkins, solía
Y luego ejecute cada contenedor acoplable con
Usar setfacl parece una mejor opción, y no se necesita ningún "usuario -u". Los contenedores se ejecutan como el mismo usuario que ejecuta Jenkins. Pero agradecería cualquier comentario de los expertos en seguridad.
fuente
utilizar debajo de dockerfile
fuente
en mi caso solo estaba comenzando el servicio de docker:
fuente
a menudo es necesario reiniciar para que surta efecto en el nuevo grupo de usuarios y usuario.
fuente
Si está ejecutando Jenkins dentro de un contenedor acoplable y su Jenkins se está vinculando al acoplador host, puede solucionarlo solo con el Dockerfile a continuación:
fuente
Tal vez deberías ejecutar la ventana acoplable con la opción "-u root" desde el principio
Al menos eso resolvió mi problema
fuente
root
. Al menos esto es lo que me pasó, con Docker 18.06.1.