GitLab CI - 无法从图像中连接到 Docker 守护程序

GitLab CI - Cannot connect to the Docker daemon from within an image

我有一个基于节点的项目,以下是构建过程中需要执行的前几个步骤:

npm install
npm run build
docker build -t client .

上面的最后一个命令构建了以下 Dockerfile:

FROM docker.artifactory.abc.net/nginx
COPY build /usr/share/nginx/html
COPY default.conf /etc/nginx/conf.d/default.conf

.gitlab-ci.yml的内容:

image: docker.artifactory.abc.net/docker/node:1.0

stages:
   - build
   - deploy

build:
   stage: build
   script:
   - npm install
   - npm run build
   - docker build -t client .

在上面的 Dockerfile 中,我使用了自定义节点映像 (node:1.0),其中包含 apk 的代理设置和 Artifactory 配置,因此所有依赖项都使用 Artifactory 获取。现在,当我 运行 这个版本时,我在执行最后一个命令 (docker build -t client .) 时收到 docker: command not found 错误,这是预期的,因为基本图像是用于 node 而不是'包含 docker。因此,我根据 this link 添加 docker 设置说明到节点 Dockerfile,除了配置 ENTRYPOINT 和 CMD 的最后 3 行。

现在当我 运行 构建时,我得到:

$ docker build -t client .
Sending build context to Docker daemon  372.7MB

Step 1 : FROM docker.artifactory.abc.net/nginx
Get https://docker.artifactory.abc.net/v2/nginx/manifests/latest: unknown: Authentication is required
ERROR: Job failed: exit code 1

根据我过去的经验,这个错误与 运行 docker login 命令有关。由于 official image 中的 docker 设置使用 tar,我不得不将 docker 用户添加到 /etc/group,然后将当前用户(root)添加到 docker 组。还在 Dockerfile 中添加了 docker login 命令,如下所示:

    addgroup docker; \
    adduser root docker; \
    docker login docker.artifactory.abc.net -u svc-art -p "ZTg6#&kq"; \

在那之后,如果我尝试构建这个 Dockerfile,我会收到以下错误:

+ dockerd -v
Docker version 17.05.0-ce, build v17.05.0-ce
+ docker -v
Docker version 17.05.0-ce, build v17.05.0-ce
+ adduser root docker
+ tail -2 /etc/group
node:x:1000:node
docker:x:101:root
+ docker login docker.artifactory.abc.net -u svc-art -p ZTg6#&kq
Warning: failed to get default registry endpoint from daemon (Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?). Using system default: https://index.docker.io/v1/
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

我也做了一个 ls -ltr /var/run/docker.sock; 并且 docker 套接字文件不存在 图像中。这似乎是问题所在。

知道如何让它工作吗?

从您提供的示例来看,我看不到您调用 docker 服务的位置,因此我假设您没有调用它,也没有登录注册表。

您的管道应该如下所示:

 image: docker.artifactory.abc.net/docker/node:1.0

 stages:
    - build
    - deploy

 build:
   image: docker:latest
   services:
   - docker:dind
   stage: build
   script:
     - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.example.com
     - docker build -t registry.example.com/group/project/image:latest .
     - docker push registry.example.com/group/project/image:latest

您还可以找到更多信息here