docker - run - Cómo montar el conector de la ventana acoplable como volumen en el contenedor de la ventana acoplable con el grupo correcto
jenkins docker pipeline (2)
Un poco tarde, pero esto podría ayudar a otros usuarios que están luchando con el mismo problema:
El problema aquí es que el grupo de docker
en su host de docker tiene una identificación de grupo diferente a la id del grupo de docker
dentro de su contenedor. Dado que el demonio solo se preocupa por la ID y no por el nombre del grupo, su solución solo funcionará si estas ID coinciden por accidente.
La forma de resolver esto es utilizando tcp en lugar de usar un socket Unix utilizando la opción -H al arrancar el motor Docker. Debe tener mucho cuidado con esto, ya que esto permite que cualquier persona que tenga acceso a este puerto obtenga acceso de root a su sistema.
Una forma más segura de solucionar este problema es asegurarse de que el grupo de docker
dentro del contenedor tenga la misma identificación de grupo que el grupo de docker
fuera del contenedor. Puedes hacer esto usando argumentos de compilación para tu docker build
:
Dockerfile:
FROM jenkinsci
ARG DOCKER_GROUP_ID
USER root
RUN curl -o /root/docker.tgz https://get.docker.com/builds/Linux/x86_64/docker-1.12.5.tgz && tar -C /root -xvf /root/docker.tgz && mv /root/docker/docker /usr/local/bin/docker && rm -rf /root/docker*
RUN curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
RUN groupadd -g $DOCKER_GROUP_ID docker && gpasswd -a jenkins docker
USER jenkins
Y luego construirlo usando
docker build --build-arg DOCKER_GROUP_ID=`getent group docker | cut -d: -f3` -t my-jenkins-image .
Después de esto, puede ejecutar su imagen y tener acceso a la ventana acoplable como no root
docker run -v /var/run/docker.sock:/var/run/docker.sock -p 8080:8080 -ti my-jenkins-image
Debido a que esta solución depende de proporcionar la identificación de grupo correcta al demonio de la ventana acoplable cuando se está construyendo la imagen, esta imagen debería construirse en la máquina (es) donde se está utilizando. Si crea la imagen, la empuja y alguien más la saca de su máquina, lo más probable es que la identificación del grupo no vuelva a coincidir.
Quiero ejecutar una instancia de Jenkins en un contenedor docker.
Quiero que el propio Jenkins pueda hacer girar los contenedores de la ventana como esclavos para realizar pruebas.
Parece que la mejor manera de hacer esto es usar
docker run -v /var/run.docker.sock:/var/run/docker.sock -p 8080:8080 -ti my-jenkins-image
El Dockerfile
que estoy usando es
FROM jenkins
COPY plugins.txt /usr/share/jenkins/plugins.txt
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt
USER root
RUN apt-get update && apt-get install -y docker.io
RUN usermod -aG docker jenkins
USER jenkins
Si comienzo una sesión de bash en mi contenedor en ejecución y ejecuto la docker info
en mi imagen, obtengo
$ docker info
FATA[0000] Get http:///var/run/docker.sock/v1.18/info: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?
Y si ejecuto la sesión de bash como root
docker exec -u 0 -ti cocky_mccarthy bash
root@5dbd0efad2b0:/# docker info
Containers: 42
Images: 50
...
Así que supongo que el grupo docker
que estoy agregando el usuario de Jenkins es el grupo para el docker interno, por lo tanto, el socket no se puede leer sin sudo
. Eso es un tipo de problema, ya que el plugin Jenkins docker, etc., no está configurado para usar sudo
.
¿Cómo puedo montar el zócalo para que pueda usarse desde la imagen sin sudo
?
Usé su archivo docker pero hice una pequeña edición:
FROM jenkins
COPY plugins.txt /usr/share/jenkins/plugins.txt
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt
USER root
RUN apt-get update
RUN groupadd docker && gpasswd -a jenkins docker
USER jenkins
Después de construir la imagen, puedo comenzar usando (estoy en centos7):
docker run -d /
-v /var/run/docker.sock:/var/run/docker.sock /
-v $(which docker):/usr/bin/docker:ro /
-v /lib64/libdevmapper.so.1.02:/usr/lib/x86_64-linux-gnu/libdevmapper.so.1.02 /
-v /lib64/libudev.so.0:/usr/lib/x86_64-linux-gnu/libudev.so.0 /
-p 8080:8080 /
--name jenkins /
--privileged=true -t -i /
test/jenkins
Intentaste instalar el paquete docker.io dentro de tu imagen. Pero este paquete también está en su host (de lo contrario no es posible ejecutar contenedores docker en él). Por lo tanto, se recomienda montar esto en su contenedor en lugar de instalarlo en su archivo docker. Creo que el mount / lib64 / ... es específico para Centos 7.
$ docker exec -it 9fc27d5fcec1 bash
jenkins@9fc27d5fcec1:/$ whoami
jenkins
jenkins@9fc27d5fcec1:/$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fc27d5fcec1 test "/bin/tini -- /usr/lo" 6 minutes ago Up 6 minutes 0.0.0.0:8080->8080/tcp, 50000/tcp jenkins