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:dind
和 google/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
我在 运行 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:dind
和 google/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