docker compose 无法从 google 容器注册表中拉取镜像

docker compose can't pull image from google container registory

我有 google 容器注册表上的图像从 docker 中心移动。我有我的 docker-compose.yml。撰写文件已成功从 docker 集线器中提取图像。但我无法从 google 容器注册表中提取。

登录容器注册表的步骤

  1. gcloud auth revoke --all
  2. gcloud 授权登录
  3. gcloud 配置设置项目 projectId
  4. gcloud auth activate-service-account deploy@projectId.iam.gserviceaccount.com --key-file=service-account.json
  5. gcloud auth 配置-docker
  6. (a) gcloud auth 打印访问令牌 | docker login -u oauth2accesstoken --password-stdin https://asia.gcr.io

登录结果成功

docker-组成

ERROR: pull access denied for [my_image_name], repository does not exist or may require 'docker login': denied: requested access to the resource is denied

我可以用下面的命令拉取镜像

docker pull asia.gcr.io/projectid/myimagename/data-api:latest

docker撰写

version: "3.3"
services:
  data_api:
    container_name: myimagename-data-api
    image: myimagename/data-api
    expose:
      - 4000
    ports:
      - "4001:4000"
    depends_on:
      - db
    environment:
      DATABASE_URL: mysql://root:root@db:3306/myimagename
      ACCESS_TOKEN_SECRET: xxxxxxxxxx
      REFRESH_TOKEN_SECRET: xxxxxxxxx
    networks:
      - db-api

  db:
    container_name: myimagename-db
    image: myimagename/db
    restart: always
    volumes:
      - ./db/data/:/var/lib/mariadb/data
    environment:
      MARIADB_ROOT_PASSWORD: root
      MARIADB_DATABASE: myimagename
    expose:
      - 3306
    ports:
      - "3307:3306"
    networks:
      - db-api

networks:
  db-api:

我在这里的偏好是使用我的个人 (gcloud config get-value account) 帐户的凭据,因为它最简单:

gcloud auth print-access-token \
| docker login \
  --username=oauth2accesstoken \
  --password-stdin \
  asia.gcr.io

如果您使用服务帐户(密钥),您需要确保该帐户对项目具有适当的权限(对于推|拉,您需要 roles/storage.Admin?)(!) 或,如果您更喜欢代表注册表的存储桶。

另一个挑战是,如果您使用的是 Snaps (?),则 Docker 运行时的凭据存储与 Docker Compose 使用的凭据存储之间可能存在分区。

I was unclear whether you can docker pull from the registry?

如果您查看 service-account.json 文件,您会发现它不是传统意义上的您的“密码”。因此,将其作为标准输入密码输入是行不通的。编辑:TIL - 您 可以 根据 doc

通过管道将凭据文件作为密码输入

我建议使用 gcloud credential helper——如果你有权限,你可以用你自己的身份登录,或者你可以使用带有 credentials.json 文件的服务帐户——这似乎是你的情况那里。请务必在您的服务帐户上拥有正确的 IAM 权限。

仅拉取(读取):

  • roles/storage.objectViewer

推(写)和拉:

  • roles/storage.legacyBucketWriter

好的,我终于找到问题了。它是图像名称。我们不能使用与 docker 集线器相同的图像名称。我们需要完整路径。

图片:asia.gcr.io/projectid/myimagename/data-api:最新

而不是myimagename/data-api