Gitlab管道码头构建阶段

时间:2018-04-16 10:38:55

标签: docker gitlab gitlab-ci gitlab-ci-runner

我正在尝试在我的gitlab管道中实现一个docker构建阶段。理想情况下,我可以先构建映像,然后针对容器运行后续阶段。但是,当我在下面的 gitlab-ci.yaml 中使用构建步骤时,我有时会收到错误:

  连接期间出现

错误:获取http://docker:2375/v1.37/info:在10.51.240.10:53上拨打tcp:lookup docker:没有这样的主机   错误:作业失败:执行远程命令时出错:命令以非零退出代码终止:在Docker Container中执行错误:1

在它不起作用的情况下,我只能猜测停泊器守护程序还没有为连接做好准备。有没有人对如何实现这一点有任何想法?

gitlab-ci.yaml

stages:
  - build

build:
  image: docker:18
  services:
    - docker:18-dind
  variables:
    DOCKER_DRIVER: overlay
    DOCKER_HOST: tcp://docker:2375/
  before_script:
    - docker info
  script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
    - docker pull ${CI_REGISTRY_IMAGE}:latest || echo Could not fetch ${CI_REGISTRY_IMAGE}:latest from registry
    - docker pull ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG} || echo Could not fetch ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG} from registry
    - docker build -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG} --cache-from ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG} .
    - docker push ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG}
    - if [[ ${CI_COMMIT_REF_SLUG} == "master" ]] ; then docker tag ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG} ${CI_REGISTRY_IMAGE}:latest ; fi
    - if [[ ${CI_COMMIT_REF_SLUG} == "master" ]] ; then docker push ${CI_REGISTRY_IMAGE}:latest ; fi
  stage: build

更新:我正在使用kubernetes执行者。

4 个答案:

答案 0 :(得分:1)

我们在几乎所有相同的条件下都看到了这个完全相同的错误(我们为DOCKER_HOST指定了localhost而不是docker,我们使用overlay2而不是plain  覆盖)。我们主要在Docker执行器上看到它;现在我们只是把它变成了执行者,因为我们重新开始工作并取得成功。我们已经检查过,之前没有对跑步者的争论,所以我们无法找到任何解释。

答案 1 :(得分:0)

你是否正在使用gitlab-runner来运行工作?如果是,您是否正在设置--executor docker注册跑步者?

您是将/var/run/docker.sock作为卷传递给跑步者吗?

我在GitLab CI中构建的docker图像没有任何问题。我没有传递任何DOCKER_DRIVERDOCKER_HOST变量。

答案 2 :(得分:0)

最后,我们自己在kubernetes上托管了一个跑步者,该跑步者使用舵图进行部署并将其设置为特权模式。

我们也切换到overlay2

答案 3 :(得分:0)

https://docs.gitlab.com/ce/ci/docker/using_docker_build.html#use-docker-in-docker-executor中,他们说kubernetes应该具有tcp:// localhost:2375作为DOCKER_HOST:

   # Note that if you're using Kubernetes executor, the variable should be set to
   # tcp://localhost:2375 because of how Kubernetes executor connects services
   # to the job container
   DOCKER_HOST: tcp://docker:2375/