tutorial run hub compose docker jenkins dockerfile jenkins-docker

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

source

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