如何使用 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]
可以是 us
、eu
或 asia
而 "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-repo
、my-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" {
}
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]
可以是us
、eu
或asia
而 "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-repo
、my-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" {
}