使用 docker:dind + google/cloud-sdk 找不到 docker

Ove*_*ivr 3 docker gitlab-ci gitlab-ci-runner google-cloud-sdk

docker: command not found在 gitlab-ci 中运行以下 CI 脚本时出现错误。此错误发生在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
Run Code Online (Sandbox Code Playgroud)

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

是因为与 google/cloud-sdk 的交互吗?

小智 5

你可能误解了什么services意思。从文档中

services 关键字仅定义在您的作业期间运行的另一个 docker 映像,并链接到 image 关键字定义的 docker 映像。

您需要的是一个使用 dind 映像并预装 gcloud sdk 的自定义 docker 执行程序。你可以用这个构建这样的图像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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回答,我相信你是对的。但这有点违反直觉。Gitlab 在他们的文档中提供了将 mysql 作为服务运行的示例。这样,可以在构建的任何阶段调用 `mysql`。因此,按照相同的逻辑,我应该能够在 docker 中将 Docker 作为服务运行,并在任何阶段访问 docker 命令。但事实并非如此。 (2认同)