2

我正在尝试使用 gitlab CI 设置工作以从 dockerfile 构建 docker 映像,但我在代理后面。

.gitlab-ci.yml的如下:

image: docker:stable

variables:
  DOCKER_HOST: tcp://docker:2375
  DOCKER_DRIVER: overlay2
  HTTP_PROXY: $http_proxy
  HTTPS_PROXY: $http_proxy
  http_proxy: $http_proxy
  https_proxy: $http_proxy

services:
  - docker:dind

before_script:
  - wget -O - www.google.com # just to test
  - docker search node # just to test
  - docker info # just to test

build:
  stage: build
  script:
    - docker build -t my-docker-image .

wget有效,这意味着代理设置在理论上是正确的

但是这些命令docker searchdocker info并且docker build不起作用,显然是因为代理问题。

作业输出的摘录:

$ docker search node
Warning: failed to get default registry endpoint from daemon (Error response from  daemon:
    [and here comes a huge raw HTML output including the following message: "504 - server did not respond to proxy"]

看来 docker 没有从环境变量中读取来设置代理。

注意:我确实在 --privileged 模式下使用跑步者,正如文档指示的那样

我该如何解决?

4

3 回答 3

3

如果您希望能够在代理后面的 gitlab CI 中使用 docker-in-docker (dind),您还需要在 gitlab-ci.yml 文件中设置 no_proxy 变量。主机“docker”的 NO_PROXY。

这是适合我的 gitlab-ci.yml:

image: docker:19.03.12

variables:
  DOCKER_TLS_CERTDIR: "/certs"
  HTTPS_PROXY: "http://my_proxy:3128"
  HTTP_PROXY: "http://my_proxy:3128"
  NO_PROXY: "docker"

services:
  - docker:19.03.12-dind
  
before_script:
  - docker info

build:
  stage: build
  script:
    - docker run  hello-world

祝你好运!

于 2020-09-25T21:47:25.217 回答
1

奇怪的是,解决方案是改用 gitlab 提供的特殊 dind (docker-in-docker) 映像,它无需设置服务和任何东西即可工作。.gitlab-ci.yml工作如下:

image: gitlab/dind:latest

before_script:
  - wget -O - www.google.com
  - docker search node
  - docker info

build:
  stage: build
  script:
    - docker build -t my-docker-image .

不要忘记gitlab-runner 必须使用 --privileged 标志注册

于 2018-08-08T20:39:24.270 回答
1

我无法让 docker-in-docker (dind) 在我们的公司代理后面工作。

特别是,即使按照此处的说明,命令docker build在执行时仍然会失败,FROM <some_image>因为它无法下载图像。

我使用kaniko取得了更大的成功,这似乎是 Gitlabs 当前对进行 Docker 构建的建议。

.NET Core 项目的简单构建脚本如下所示:

build:
  stage: build
  image: $BUILD_IMAGE
  script:
    - dotnet build 
    - dotnet publish Console--output publish
  artifacts:
    # Upload all build artifacts to make them available for the deploy stage.
    when: always
    paths:
      - "publish/*"
    expire_in: 1 week

kaniko:
  stage: dockerise
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  script:
    # Construct a docker-file
    - echo "FROM $RUNTIME_IMAGE" > Dockerfile
    - echo "WORKDIR /app" >> Dockerfile
    - echo "COPY /publish ." >> Dockerfile
    - echo "CMD [\"dotnet\", \"Console.dll\"]" >> Dockerfile

    # Authenticate against the Gitlab Docker repository.
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json

    # Run kaniko
    - /kaniko/executor --context . --dockerfile Dockerfile --destination $CI_REGISTRY_IMAGE:$VersionSuffix
于 2020-08-12T11:54:50.700 回答