web-dev-qa-db-ja.com

GitLab CIランナーがkubernetesのunix:///var/run/docker.sockに接続できない

GitLabはkubernetesクラスターで実行されています。ランナーは、ビルドアーティファクトを使用してdockerイメージをビルドできません。私はすでにこれを修正するためにいくつかのアプローチを試しましたが、運はありません。以下にいくつかの設定スニペットを示します。

.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

パッケージステージログ:

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

何が間違っていますか?

27
cardinal-gray

これを使用する必要はありません:

DOCKER_DRIVER: overlay

原因は、OVERLAYがサポートされていないように思われるため、svc-0コンテナはそれで開始できないことです。

$ 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."

また、export DOCKER_Host="tcp://localhost:2375" 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

Kubernetesを使用する場合は、ビルドイメージを調整してDockerエンジンに接続する必要があります。

ビルドイメージに追加します。

DOCKER_Host=tcp://localhost:2375

ドキュメントからの引用:

Docker-in-dockerイメージとしても知られるdocker:dindを実行することも可能ですが、残念ながら特権モードでコンテナーを実行する必要があります。あなたがそのリスクを受け入れても構わないと思えば、一見すると簡単ではないように見えるかもしれない他の問題が発生します。 dockerデーモンは通常.gitlab-ci.yamlでサービスとして起動されるため、ポッド内の別のコンテナーとして実行されます。基本的に、ポッド内のコンテナーは、ローカルホストを使用して相互にアクセスできるように、割り当てられたボリュームとIPアドレスのみを共有します。 /var/run/docker.sockはdocker:dindコンテナーによって共有されておらず、dockerバイナリーはデフォルトでそれを使用しようとします。これを上書きし、クライアントがtcpを使用して他のコンテナのdockerデーモンにアクセスできるようにするには、ビルドコンテナの環境変数にDOCKER_Host = tcp:// localhost:2375を含めるようにしてください。

KubernetesのGitlab-CI

9
opHASnoNAME