web-dev-qa-db-fra.com

Le coureur GitLab CI ne peut pas se connecter à unix: ///var/run/docker.sock dans kubernetes

GitLab s'exécute dans le cluster Kubernetes. Le coureur ne peut pas créer d'image de menu fixe avec des artefacts de construction. J'ai déjà essayé plusieurs approches pour résoudre ce problème, mais pas de chance. Voici quelques extraits de configuration:

.gitlab-ci.yml

image: docker:latest
services:
  - docker:dind

variables:
  DOCKER_DRIVER: overlay

stages:
  - build
  - package
  - deploy

maven-build:
  image: maven:3-jdk-8
  stage: build
  script: "mvn package -B --settings settings.xml"
  artifacts:
    paths:
      - target/*.jar

docker-build:
  stage: package
  script:
  - docker build -t gitlab.my.com/group/app .
  - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN gitlab.my.com/group/app
  - docker Push gitlab.my.com/group/app

config.toml

concurrent = 1
check_interval = 0

[[runners]]
  name = "app"
  url = "https://gitlab.my.com/ci"
  token = "xxxxxxxx"
  executor = "kubernetes"
  [runners.kubernetes]
    privileged = true
    disable_cache = true

Journal d'étape du paquet:

running with gitlab-ci-multi-runner 1.11.1 (a67a225)
  on app runner (6265c5)
Using Kubernetes namespace: default
Using Kubernetes executor with image docker:latest ...
Waiting for pod default/runner-6265c5-project-4-concurrent-0h9lg9 to be running, status is Pending
Waiting for pod default/runner-6265c5-project-4-concurrent-0h9lg9 to be running, status is Pending
Running on runner-6265c5-project-4-concurrent-0h9lg9 via gitlab-runner-3748496643-k31tf...
Cloning repository...
Cloning into '/group/app'...
Checking out 10d5a680 as master...
Skipping Git submodules setup
Downloading artifacts for maven-build (61)...
Downloading artifacts from coordinator... ok        id=61 responseStatus=200 OK token=ciihgfd3W
$ docker build -t gitlab.my.com/group/app .
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
ERROR: Job failed: error executing remote command: command terminated with non-zero exit code: Error executing in Docker Container: 1

Qu'est-ce que je fais mal?

27
cardinal-gray

Pas besoin d'utiliser ceci:

DOCKER_DRIVER: overlay

car il semble que OVERLAY ne soit pas supporté, le conteneur svc-0 ne peut donc pas commencer avec:

$ kubectl logs -f `kubectl get pod |awk '/^runner/{print $1}'` -c svc-0
time="2017-03-20T11:19:01.954769661Z" level=warning msg="[!] DON'T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON'T KNOW WHAT YOU'RE DOING [!]"
time="2017-03-20T11:19:01.955720778Z" level=info msg="libcontainerd: new containerd process, pid: 20"
time="2017-03-20T11:19:02.958659668Z" level=error msg="'overlay' not found as a supported filesystem on this Host. Please ensure kernel is new enough and has overlay support loaded."

Ajoutez également export DOCKER_Host="tcp://localhost:2375" au docker-build:

 docker-build:
  stage: package
  script:
  - export DOCKER_Host="tcp://localhost:2375"
  - docker build -t gitlab.my.com/group/app .
  - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN gitlab.my.com/group/app
  - docker Push gitlab.my.com/group/app
18
cardinal-gray

Lorsque vous utilisez Kubernetes, vous devez ajuster votre image de build pour vous connecter au moteur Docker.

Ajouter à votre image de construction:

DOCKER_Host=tcp://localhost:2375

Citation de la documentation:

L'exécution du menu fixe: dind, également connue sous le nom d'image de menu fixe, est également possible, mais il faut malheureusement que les conteneurs soient exécutés en mode privilégié. Si vous êtes prêt à prendre ce risque, d’autres problèmes apparaîtront qui pourraient ne pas sembler aussi simples au premier abord. Comme le démon docker est démarré en tant que service, généralement dans votre fichier .gitlab-ci.yaml, il sera exécuté en tant que conteneur distinct dans votre pod. Fondamentalement, les conteneurs dans les pods partagent uniquement les volumes qui leur sont affectés et une adresse IP par laquelle ils peuvent se joindre à l'aide de localhost. /var/run/docker.sock n'est pas partagé par le menu fixe: dind container et le binaire du menu fixe tente de l'utiliser par défaut. Pour écraser ceci et obliger le client à utiliser tcp pour contacter le démon docker de l'autre conteneur, veillez à inclure DOCKER_Host = tcp: // localhost: 2375 dans vos variables d'environnement du conteneur de génération.

Gitlab-CI sur Kubernetes

9
opHASnoNAME