【发布时间】:2023-03-31 03:34:01
【问题描述】:
这个问题似乎与我在 GCP 中的权限有关,但到目前为止尝试设置正确的权限并没有奏效。
我正在使用com.google.cloud.tools:jib-maven-plugin 将 Spring Boot 项目打包到容器中并将其推送到 Google Artifact Registry (GAR)。当我在本地运行它时它工作得很好,但是当我使用 Google Cloud Build 运行 maven 构建时它会失败。它说它失败是因为缺少artifactregistry.repositories.downloadArtifacts 权限。
但这是根据Google Docs默认启用的权限之一。
我的目标是 Google Artifacts (docker) Registry。我能够将目标更改为 Google Container Registry(已弃用,因此我需要更改为 GAR),并且在 Cloud Build 下运行良好,没有权限问题。该构建还从存储在不同 GAR 中的 maven 存储库下载 jar 文件,尽管在同一个 Google 项目中。很明显,该 maven GAR 的权限是可以的。
我验证了在本地运行 maven 构建工作,包括写入 GAR,这消除了 jib 插件配置或 GAR 配置中出现的问题。这是使用我自己的用户凭据。
我尝试了什么?
- 我将适当的角色添加到 Cloud Build 使用的默认服务帐户(尽管它们应该存在)。
downloadArtifacts权限包含在角色 Artifact Registry Reader 中,因此我添加了该角色以及 Artifact Registry Writer。 - 我切换到不同的服务帐户(构建服务帐户,我们称之为 BSA),是的,确保具有相同的适当角色(见上文)。
- 我将 BSA 作为主体添加到目标 GAR,并在那里为其分配了适当的角色(越来越绝望)
- 我的用户凭据包括所有者角色,因此我将所有者角色添加到 BSA(我不想保留)
所有这些都给了我相同的权限被拒绝错误。以防万一我真的误解了一些东西,我在我的 Cloud Build yaml 中添加了一个步骤来运行 gcloud info 并验证,是的,它使用的是我配置的 BSA 以及我需要的角色。
我错过了什么吗? 谢谢
...编辑 更多信息。我的大多数构建都使用 jib,但一个使用 Spotify 创建本地 docker 映像,然后使用 docker 推送到注册表。 这行得通!所以问题是特定于jib的。不知何故,在云构建下,jib 看不到凭据,尽管它确实在本地看到了它们。
...编辑 实际错误信息:
Failed to execute goal com.google.cloud.tools:jib-maven-plugin:1.6.1:build (build-and-push-docker-image) on project knifethrower: Build image failed, perhaps you should make sure you have permissions for australia-southeast1-docker.pkg.dev/redacted/bonanza-platform/knifethrower and set correct credentials. See https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md#what-should-i-do-when-the-registry-responds-with-forbidden-or-denied for help: Unauthorized for australia-southeast1-docker.pkg.dev/redacted/bonanza-platform/knifethrower: 403 Forbidden
[ERROR] {"errors":[{"code":"DENIED","message":"Permission \"artifactregistry.repositories.downloadArtifacts\" denied on resource \"projects/redacted/locations/australia-southeast1/repositories/bonanza-platform\" (or it may not exist)"}]}
[ERROR] -> [Help 1]
另请注意,我使用的是最新版本的 jib:3.1.4
...编辑
我尝试了更多的东西。我在 maven 构建之前添加了一个较早的步骤,它执行 gcloud auth configure-docker --quiet --verbosity=debug australia-southeast1-docker.pkg.dev。这将创建一个 /builder/home/.docker/config.json 文件。因为对于该文件的真正位置似乎存在混淆,所以我将其复制到/root/.docker。但这并没有帮助。
我尝试的第二件事是使用$DOCKER_CONFIG 指向/builder/home/.docker 目录(as suggested here),但这也没有帮助。
在这两种情况下都有相同的错误。我确实收到了来自gcloud auth configure-docker... 的消息
WARNING: `docker` not in system PATH.
`docker` and `docker-credential-gcloud` need to be in the same PATH in order to work correctly together.
gcloud's Docker credential helper can be configured but it will not work until this is corrected.
Adding credentials for: australia-southeast1-docker.pkg.dev
Docker configuration file updated.
INFO: Display format: "default"
我认为这是试图提供帮助并告诉我它找不到安装的 docker(这是真的),但它仍然创建了凭据(也是真的)。这并不重要,因为 jib 不依赖 docker 本身,只依赖于信誉。但是还是不行。
【问题讨论】:
-
请在问题中包含您收到的实际错误。
-
好主意。完成。
-
错误信息说你应该阅读github.com/GoogleContainerTools/jib/blob/master/docs/…。您看到使用“[PROJECT_NUMBER]@cloudbuild.gserviceaccount.com”的 jib 了吗?
-
另外,如 here 所述,检查 Jib 控制台输出以验证 Jib 获取
pkg.dev图像 (knifethrower) 凭据的确切位置。例如,您应该看到类似Using credential helper docker-credential-gcr for ...pkg.dev/.../knifethrower。 -
@suztomo 是的,云构建服务帐户在那里并且具有我需要的角色。另外,正如我在 OP 中提到的那样,我切换到另一个服务帐户(BSA)以查看是否有帮助,但没有。
标签: maven google-cloud-build google-artifact-registry maven-jib