Tengo una ventana acoplable en la configuración de la ventana acoplable para CI. Esencialmente, la máquina tiene un servidor jenkins CI que usa el mismo socket acoplable de la máquina para crear nodos para CI.
Esto funcionaba muy bien hasta que actualicé Docker recientemente. He identificado el problema, pero parece que no puedo encontrar la magia adecuada para que funcione.
host $ docker exec -it myjenkins bash jenkins@container $ docker ps Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/json: dial unix /var/run/docker.sock: connect: permission denied host $ docker exec -it -u root -it myjenkins bash root@container $ docker ps ... docker ps from host container yay! ...Así que esto es lo que supongo. Tengo acceso al socket de la ventana acoplable del host desde el contenedor, pero parece que no puedo dar permiso al usuario de jenkins.
Agregué el grupo docker y también agregué el usuario jenkins al grupo docker. Pero sigo teniendo el mismo error. He reiniciado un montón de veces, así que no sé qué hacer a continuación.
¿Hay alguna forma de forzar permisos para un usuario en un socket en particular?
Debe asignar el gid del grupo docker en su host al gid de un grupo al que pertenece jenkins dentro de su contenedor. Aquí hay una muestra de mi Dockerfile de cómo construí una imagen esclava de jenkins:
ARG DOCKER_GID=993 RUN groupadd -g ${DOCKER_GID} docker \ && curl -sSL https://get.docker.com/ | sh \ && apt-get -q autoremove \ && apt-get -q clean -y \ && rm -rf /var/lib/apt/lists/* /var/cache/apt/*.bin RUN useradd -m -d /home/jenkins -s /bin/sh jenkins \ && usermod -aG docker jenkinsEl 993 resulta ser el gid de la ventana acoplable en el host en este ejemplo, lo ajustaría para que coincida con su entorno.
Solución del OP: si la reconstrucción no es una posibilidad, puede configurar el grupo acoplable en consecuencia al usar la raíz y agregar el usuario. Si intentó esto antes, es posible que deba eliminar el grupo en el esclavo ( groupdel docker ):
docker exec -it -u root myjenkins bash container $ groupadd -g 993 docker container $ usermod -aG docker jenkinsComo se mencionó en otras respuestas, debe asegurarse de que el usuario "jenkins" dentro del contenedor tenga permiso para emitir comandos Docker al motor Docker en el host a través del montaje /var/run/docker.sock .
Una manera fácil de hacer esto es:
$ docker run --rm -d --group-add $(stat -c '%g' /var/run/docker.sock) -v /var/run/docker.sock:/var/run/docker.sock -P myjenkinsPero cuidado:
Si su trabajo de Jenkins tiene la necesidad de ejecutar comandos de construcción/ejecución de Docker (por ejemplo, para construir un contenedor), esto no es suficiente. El motivo es que Jenkins en contenedores le pedirá a Docker en el host que implemente un contenedor de agente de Docker y ese contenedor de agente de Docker enfrentará "errores de permiso" similares cuando se conecte al daemon de Docker en el host.
Hay una publicación de blog que describe el problema y la solución para esto en https://blog.nestybox.com/2019/09/29/jenkins.html .
Personalmente, he tenido que hacer esto:
sudo gpasswd -a $USER dockery funcionó