docker 未找到 docker:dind + google/cloud-sdk

docker not found with docker:dind + google/cloud-sdk

我在 运行 gitlab-ci 中的以下 CI 脚本时收到错误 docker: command not found。此错误发生在 before_script 部署阶段。

services:
  - docker:dind

stages:
  - build
  - test
  - deploy

before_script:
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

build:
  stage: build
  image: docker:latest
  script:
    - docker info
    - docker version
    - docker build --pull -t $SERVICE_NAME:$CI_COMMIT_REF_NAME .
    - docker image list
    - docker tag $SERVICE_NAME:$CI_COMMIT_REF_NAME $CI_REGISTRY_IMAGE/$SERVICE_NAME:$CI_COMMIT_REF_NAME
    - docker push $CI_REGISTRY_IMAGE/$SERVICE_NAME:$CI_COMMIT_REF_NAME

test:
  image: docker:latest
  stage: test
  script:
    - docker pull $CI_REGISTRY_IMAGE/$SERVICE_NAME:$CI_COMMIT_REF_NAME
    - docker image list
    - docker run $CI_REGISTRY_IMAGE/$SERVICE_NAME:$CI_COMMIT_REF_NAME npm test

deploy:
  image: google/cloud-sdk
  stage: deploy
  environment: Production
  script:
    - echo $DEPLOY_KEY_FILE_PRODUCTION > /tmp/GCLOUD_KEYFILE.json
    - gcloud auth activate-service-account --key-file /tmp/GCLOUD_KEYFILE.json
    - rm /tmp/GCLOUD_KEYFILE.json
    - gcloud info
    - gcloud components list
  only:
    - master

我有点困惑,因为我正在运行 docker-in-docker (docker:dind) 作为服务,所以 docker 命令应该是提供给所有阶段(如果我理解正确的话),但显然不是。

是否与 google/cloud-sdk 互动?

您可能误解了 services 的意思。来自doc,

The services keyword defines just another docker image that is run during your job and is linked to the docker image that the image keyword defines.

您需要的是自定义 docker 执行程序,它使用 dind 映像并预装了 gcloud sdk。您可以使用 Dockerfile:

构建这样的图像
FROM docker:latest

RUN apk add --no-cache \
 bash \
 build-base \
 curl \
 git \
 libffi-dev \
 openssh \
 openssl-dev \
 python \
 py-pip \
 python-dev

RUN pip install docker-compose fabric
RUN curl https://sdk.cloud.google.com | bash -s -- --disable-prompts

您忘记通知顶部的 image 标签。

image: docker:latest

services:
- docker:dind
...

适合我! :)

参见:https://docs.gitlab.com/ce/ci/docker/using_docker_build.html

这个问题大约是 5 年前提出的,我不确定那个时候图像 google/cloud-sdk 是否没有 docker 二进制文件,我想不出 [=13] 的其他任何东西=] 错误多于它在标准位置不可用。无论如何,今天 2022 google/cloud-sdk 带有 docker,它可以与 docker 服务交互,因为我在 运行 之后多次来到这里,尝试使用 docker:dindgoogle/cloud-sdk,我将添加以下内容:

可以使用 google/cloud-sdk 图像中的 docker,无需为您的 Gitlab CI 创建自定义图像。问题是 google/cloud-sdk 中的 docker 尝试连接到 /var/run/docker.sock 中的套接字,如日志中所示:

$ docker build -t gcr.io/$GCP_PROJECT_ID/test:$CI_COMMIT_SHORT_SHA .
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

无论如何,您还可以检查服务 docker:dind 的日志,该服务 docker 在套接字(无法从作业容器访问)和 tcp 端口(可通过主机名访问 docker).因此,您只需要在 docker 命令中使用 tcp 端口,方法是设置环境变量 DOCKER_HOST 或添加 -H tcp://docker:2375,如

$ docker -H tcp://docker:2375 build -t gcr.io/$GCP_PROJECT_ID/test:$CI_COMMIT_SHORT_SHA .
Step 1/8 : FROM python:latest