18

我有一个我想要的 GitLab 管道:

  1. 构建 Java 应用程序
  2. 使用 docker-compose 进行测试
  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图像(或将构建我的项目的任何图像)连接到链接的 Docker-in-Docker 服务?docker:latest不是在做什么?

我已经阅读了GitLab 服务文档,但从主机名的角度来看,这对我来说才有意义。(如果你有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)
4

2 回答 2

20

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

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 变量。

于 2017-07-28T13:27:15.337 回答
3

Gitlab CI 运行器需要挂载主机 docker 套接字才能在 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 作为最后一个参数安装在此处。但是我不建议在 Gitlab CI 中使用 docker-compose,因为 Gitlab CI 有自己的语法 https://docs.gitlab.com/ce/ci/docker/using_docker_images.html

于 2017-07-26T07:03:00.067 回答