web-dev-qa-db-fra.com

Connexion à docker-in-docker depuis un runner GitLab CI

J'ai un pipeline GitLab que je veux:

  1. Créez une application Java
  2. Test à l'aide de Docker-compose
  3. Accéder à mon référentiel Docker

Le principal problème que j'ai est que cela fonctionne :

services:
  - docker:dind

docker_test:
  stage: docker_test
  image: docker:latest
  script:
  - docker version

La sortie est imprimée comme prévu:

> gitlab-ci-multi-runner exec docker --docker-privileged docker_test
...
$ docker version
Client:
 Version:      17.06.0-ce
...
Server:
 Version:      17.06.0-ce
...
Build succeeded

Bien que cela ne soit pas (étapes d'installation pour docker-ce omis):

services:
  - docker:dind

docker_test:
  stage: docker_test
  image: ubuntu:latest       << note change
  script:
  - docker version

Il échoue avec:

$ docker version
Client:
 Version:      17.06.0-ce
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 21:23:31 2017
 OS/Arch:      linux/AMD64
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
ERROR: Build failed: exit code 1
FATAL: exit code 1

Comment puis-je connecter mon image ubuntu (ou l'image qui va construire mon projet) au service Docker-in-Docker lié? Qu'est-ce que docker:latest que je ne suis pas?

J'ai lu la documentation des services GitLab , mais cela n'a de sens pour moi que du point de vue du nom d'hôte. (Si vous disposez d'un service mysql, vous pouvez vous connecter via mysql:3306.)

Modifier: Mise à jour de la commande vers echo $DOCKER_Host, Je vois dans le docker:latest image:

$ echo $DOCKER_Host
tcp://docker:2375

Et dans le ubuntu:latest image que je vois:

$ echo $DOCKER_Host
(nothing - but SO doesn't let me add a blank code line)
16
Craig Otis

Comme les informations que vous avez ajoutées, j'espère que cela fonctionne:

services:
  - docker:dind

docker_test:
  stage: docker_test
  image: ubuntu:latest
  variables:
      DOCKER_Host: "tcp://docker:2375"
  script:
  - docker version

Alternativement:

services:
  - docker:dind

docker_test:
  stage: docker_test
  image: ubuntu:latest 
  script:
  - export DOCKER_Host=tcp://docker:2375
  - docker version

Il semble que Gitlab ne définit pas la variable DOCKER_Host pour les images personnalisées.

19
Robert

Le runner Gitlab CI doit monter le socket docker des hôtes afin d'exécuter le docker dans le docker. Par exemple:

docker exec gitlab-runner gitlab-runner register \
           --non-interactive \
           --url https://gitlab.com/ci \
           --registration-token TOKEN\
           --description "Docker Runner" \
           --tag-list "docker" \
           --executor docker \
           --docker-image "docker:latest" \
           --docker-volumes /var/run/docker.sock:/var/run/docker.sock

Comme vous pouvez le voir, le docker.sock est monté ici comme dernier paramètre. Cependant, je ne recommanderais pas l'utilisation de docker-compose pour Gitlab CI, car Gitlab CI a sa propre syntaxe https://docs.gitlab.com/ce/ci/docker/using_docker_images.html

3
madnight