从GitLab CI运行器连接到docker-in-docker

时间:2017-07-26 01:48:26

标签: docker gitlab gitlab-ci docker-in-docker

我想要一个GitLab管道:

  1. 构建Java应用程序
  2. 使用docker-compose进行测试
  3. 推送到我的Docker存储库
  4. 我遇到的主要问题是有效

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

    输出按预期打印:

    > 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
    

    虽然(省略了docker-ce的安装步骤):

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

    失败了:

    $ 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
    

    如何使我的ubuntu图像(或任何图像构建我的项目)连接到链接的Docker-in-Docker服务? docker:latest做什么我不是?

    我已经阅读了GitLab services documentation,但从主机名的角度来看,这只对我有意义。 (如果您有mysql服务,则可以通过mysql:3306进行连接。)

    修改:将命令更新为echo $DOCKER_HOST,我在docker:latest图片中看到了:

    $ echo $DOCKER_HOST
    tcp://docker:2375
    

    ubuntu:latest图片中,我看到了:

    $ echo $DOCKER_HOST
    (nothing - but SO doesn't let me add a blank code line)
    

2 个答案:

答案 0 :(得分:16)

根据您添加的信息,我希望这确实有效:

services:
  - docker:dind

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

可替换地:

services:
  - docker:dind

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

似乎Gitlab没有为自定义图像设置DOCKER_HOST变量。

答案 1 :(得分:3)

Gitlab CI运行器需要安装主机docker socket才能在docker中执行docker。例如:

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

正如您所见,docker.sock在此处作为最后一个参数安装。但是我不建议使用docker-compose用于Gitlab CI,因为Gitlab CI有自己的语法 https://docs.gitlab.com/ce/ci/docker/using_docker_images.html