web-dev-qa-db-fra.com

Rôle du service docker-in-docker (dind) dans gitlab ci

Selon l’officiel documentation de gitlab , un moyen de permettre à docker build au sein de ci pipelines, consiste à utiliser le service dind (en termes de gitlab-ciservices ).

Cependant, comme c'est toujours le cas avec les travaux ci exécutés sur des exécuteurs de docker, le docker:latest _ l'image est également nécessaire.

Quelqu'un pourrait-il expliquer:

  • quelle est la différence entre le docker:dind et le docker:latest images?
  • (le plus important): pourquoi sont les deux le service et l'image du menu fixe nécessaire (par exemple, comme indiqué dans cet exemple , lié à la documentation github) pour effectuer par exemple une docker build dans un emploi ci? le docker:latest _ image ( dans laquelle le travail sera exécuté !) incorpore le démon docker (et je pense que le docker-compose _ également), qui sont les outils nécessaires aux commandes dont nous avons besoin (par exemple, docker build, docker Push etc)?

À moins que je ne me trompe, la question devient plus ou moins:

Pourquoi un client docker et un démon docker ne peuvent pas résider dans le même conteneur docker (activé)

29
pkaramol

quelle est la différence entre le docker: dind et le docker: dernières images?

  • docker:latest contient tout le nécessaire pour se connecter à un démon docker, c.-à-d. pour exécuter docker build, docker run et autres choses de ce genre. Il contient également le démon docker, mais il n'est pas démarré en tant que point d'entrée.
  • docker:dind s'appuie sur docker:latest et lance un démon docker comme point d’entrée.

Donc, leur contenu est presque le même mais par leurs points d’entrée, on est configuré pour se connecter à tcp://docker:2375 en tant que client alors que l’autre est destiné à être utilisé pour un démon.

pourquoi le service et l'image du menu fixe sont-ils nécessaires […]?

Vous n'avez pas besoin des deux. Vous pouvez simplement utiliser l'un des deux, démarrez dockerd comme première étape, puis exécutez votre docker build et docker run _ commande comme d'habitude, comme je le faisais ici ; apparemment, c’était l’approche originale dans gitlab à un moment donné . Mais je trouve plus propre d'écrire simplement service: docker:dind au lieu d'avoir un before_script pour installer dockerd. De plus, vous n'avez pas à comprendre comment démarrer et installer dockerd correctement dans votre image de base (si vous n'utilisez pas docker:latest.)

Déclarer le service dans votre .gitlab-ci.yml vous permet également d’échanger facilement le menu fixe si vous savez que votre coureur est en train de monter son système /var/run/docker.sock dans votre image. Vous pouvez définir le variable protégéeDOCKER_Host à unix:///var/run/docker.sock pour obtenir des constructions plus rapides. Les autres personnes qui n’ont pas accès à un tel coureur peuvent toujours utiliser votre référentiel et se replier sur le service dind sans modifier votre .gitlab-ci.yml.

36
saraedum