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

我有一个GitLabpipe道,我想要:

  1. 构build一个Java应用程序
  2. 使用docker-compose进行testing
  3. 推送到我的Docker存储库

我遇到的主要问题是这个工作

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映像(或任何图像将build立我的项目)连接到链接的Docker在Docker服务? 什么是docker:latest这样做,我不是?

我已经阅读了GitLab服务文档 ,但是从主机名的angular度来看,这只对我有意义。 (如果你有一个mysql服务,你可以通过mysql:3306连接mysql:3306 。)

编辑:更新命令echo $DOCKER_HOST ,我在docker:latest看到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) 

作为您添加的信息,我希望这可以工作:

 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_HOSTvariables。

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