如何使用 terraform 创建 gcr 存储库?

How do you create a gcr repo with terraform?

https://www.terraform.io/docs/providers/google/d/google_container_registry_repository.html

有数据源但没有资源。

gcr好像没有直达API。是否有使用 terraform 创建 gcr 存储库的解决方法?我可以在 gcr 使用的 "artifacts" 存储桶中创建一个文件夹吗?有没有办法手动改造 gcr 存储库?

首先,google_container_registry_repository 的 Terraform 概念似乎不完整,因为它只代表 "root repositories" :

  • gcr.io/[PROJECT_ID]
  • [REGION].gcr.io/[PROJECT_ID],其中 [REGION] 可以是 useuasia

而 "repository"(在 GCP 术语中)也可以指代:

  • [REGION].gcr.io/[PROJECT_ID]/my-repo
  • [REGION].gcr.io/[PROJECT_ID]/my-repo/my-sub-repo
  • ...

Terraform 数据源中没有这些类型的存储库的概念。

话虽这么说:

  • "root repositories"无法创建并由Google管理(如果出现新区域xy,则xy.gcr.io将由Google创建)
  • 用于订购图像的其他存储库(例如,每个开发人员或每个项目的存储库)似乎是一种抽象概念,更像是 directories in Google Cloud Storage。它们是在您推送图像时创建的"on-the-fly",如果其中没有图像,它们就不存在。为了完成 GCS 目录和 GCR 存储库之间的类比,请注意也没有 google_storage_bucket_directory 资源

对于后一种存储库(my-repomy-repo/my-subrepo),无法配置底层存储桶:它将始终为 artifacts.[PROJECT-ID].appspot.com[REGION].artifacts.[PROJECT-ID].appspot.com,具体取决于的 "root repository"。无法隔离不同存储桶中的不同存储库。

总而言之:您无法创建 GCR 存储库,无论是使用 Terraform、gcloud、来自网络 UI 等

可以使用 Terraform 创建 GCR,但您不​​能破坏它们或更改区域,问题在于 Google 如何实现 GCR 而不是限制Terraform 的。

正如 norbjd 所解释的那样(恕我直言)GCR 就像存储容器图像的存储桶的前端。

GCP好像完全没有删除GCR的概念,必须删除底层的bucket。 Terraform 无法处理这个,因为它就像在说“当你申请时使用资源 A 但当你销毁时使用资源 B”。
要销毁您需要一些其他机制,例如手动删除存储桶或 运行 gcloud 命令。

这个简单的代码将创建一个存储库,并将报告为已被 terraform destroy 成功销毁,但仍会出现在您项目的容器注册表中(并且可能会产生存储成本):

# This creates a global GCR in the current project.
# Though it actually creates the multi-region bucket 'artifacts.[PROJECT_ID].appspot.com'
resource "google_container_registry" "my_registry" {
}