web-dev-qa-db-fra.com

Impossible de se connecter à Docker dans le conteneur Docker Jenkins MacOS

Après deux jours entiers de lecture et d'essais, je viens ici avec humilité pour demander comment faire ce travail, parce que rien des autres réponses ne m'a aidé à faire ce travail.

Je suis sur un macos 10.13.6 (High Sierra)

Exécution de Docker Desktop pour mac 2.2.0.5 (43884)

Engine: 19.03.8
Compose 1.25.4

Je veux lancer jenkins pour étudier des trucs de pipeline, c'est donc mon "docker-compose.yml"

version: "3.2"

services:
  jenkins:

    build: 
      dockerfile: dockerfile
      context: ./build

    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/var/jenkins_home

Le premier problème est que l'image que j'utilise jenkins/jenkins:lts n'a pas de client docker installé, donc même le mappage du socket via des volumes je ne peux pas utiliser docker version la sortie de cette commande est bash: docker: command not found.

Ceci est mon pipeline juste pour le test (de la documentation jenkins):

pipeline {
    agent { docker { image 'node:6.3' } }
    stages {
        stage('build') {
            steps {
                sh 'npm --version'
            }
        }
    }
}

Donc à travers ce plugin https://plugins.jenkins.io/docker-plugin/ Je peux aller dans "Gérer Jenkins> Gérer les nœuds et les nuages> Configurer les nuages> Ajouter un nouveau cloud" et sur "Détails de Docker Cloud ..."

J'ai l'URI de l'hôte où je peux mettre "unix: ///var/run/docker.sock" qu'il utilisera le docker de mon hôte macos pour faire ce que jenkins doit faire.

J'ai essayé toutes les suggestions d'Internet, de créer l'utilisateur jenkins, l'utilisateur docker, mettre l'utilisateur jenkins sur le groupe docker e d'autres trucs mais aucun d'eux ne fonctionne sur le mac.

La grande majorité des questions posées concerne Linux et toutes semblent avoir résolu le problème, mais lorsque j'essaye de répliquer sur macos, cela ne fonctionne tout simplement pas.

Peut-être qu'il y a une étape que je manque, ou que les gens savent déjà qu'ils doivent faire certaines étapes, mais j'échoue lamentablement.

Certaines des étapes que j'ai essayées:

créer un utilisateur et un groupe jenkins:

Sudo dscl . create /Users/jenkins UniqueID 1000 PrimaryGroupID 1000
Sudo dscl . create /Groups/jenkins gid 1000

a créé le menu fixe de groupe:

Sudo dscl . create /Groups/docker gid 1001

Ajout de l'utilisateur jenkins au groupe docker

Sudo dscl . append /Groups/docker GroupMembership jenkins

Vérifié si l'utilisateur fait vraiment partie du groupe

$ dsmemberutil checkmembership -u 1000 -g 1001
user is a member of the group

J'ai essayé de changer le propriétaire du socket depuis l'intérieur du conteneur jenkins (c'est pourquoi je construisais l'image, mais cela n'a pas fonctionné)

J'ai essayé de changer la propriété du socket sur les macos hôtes, mais cela ne change tout simplement pas. Le socket est toujours avec ces autorisations.

lrwxr-xr-x 1 root daemon 68B Apr 28 10:14 docker.sock -> /Users/metasix/Library/Containers/com.docker.docker/Data/docker.sock
6
Mateus Silva

Vous devez activer la mise en réseau en mode hôte en ajoutant network: Host dans votre fichier de composition:


services:
  jenkins:

    build: 
      dockerfile: dockerfile
      context: ./build
      network: Host

    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/var/jenkins_home

Cela permettra à votre conteneur Docker invité de voir le réseau des hôtes. Le problème est que Docker Desktop pour MacOS ne prend pas en charge l'écoute sur le port TCP. Il existe une solution de contournement connue en utilisant socat. https://www.ivankrizsan.se/ 2016/05/21/docker-api-over-http-on-mac-os-x-with-docker-for-mac-beta / . Une fois que vous avez configuré socat pour acheminer de docker.socker vers TCP 2376 a défini l'URI de votre hôte sur tcp: //0.0.0.0: 2376. Et bien sûr, vous devrez créer un nouveau Dockerfile pour étendre jenkins/jenkins: lts one with FROM jenkins/jenkins:lts et ajoutez Docker au conteneur comme suggéré dans une autre réponse

1
Kevin Matthews

Pour jenkins, le mieux est d'avoir des agents qui exécuteront tous les travaux et le maître qui ne fera que les travaux d'orchestration.

Il y a quelques années, j'ai construit un agent JNLP qui s'enregistre auprès de jenkins master, vous pouvez vérifier mon repo ici: https://github.com/jmaitrehenry/docker-jenkins-jnlp Comme je l'ai dit, je fait comme il y a 3 ans et peut être un peu dépassé.

À propos de votre problème, vous devez savoir que Docker pour Mac exécute des conteneurs dans une petite VM, donc lorsque vous ajoutez un utilisateur sur MacOS, le VM ne l'a pas. Et Docker pour Mac le fait beaucoup de magie pour mapper uid à l'intérieur de votre mac avec des uid à l'intérieur de conteneurs.

Vous pouvez essayer d'ajouter le client docker dans votre Dockerfile, pour cela, essayez d'ajouter ces étapes:

FROM jenkins/jenkins:lts
[...]

# Switch to root as the base image switch to jenkins user
USER root

# Download docker-cli and install it
RUN curl -o docker-ce-cli.deb https://download.docker.com/linux/debian/dists/stretch/pool/stable/AMD64/docker-ce-cli_19.03.8~3-0~debian-stretch_AMD64.deb && \
    dpkg -i docker-ce-cli.deb && \
    rm docker-ce-cli.deb

# Switch back to jenkins user
USER jenkins
1
jmaitrehenry