本页面介绍如何使用 Cloud Run 卷装载将 Cloud Storage 存储桶作为存储卷进行装载。
在 Cloud Run 中将存储桶作为卷进行装载会将存储桶内容以文件的形式呈现在容器文件系统中。将存储桶作为卷装载后,您可以使用编程语言的文件系统操作和库(而不是使用 Google API 客户端库)来访问该存储桶,就像访问本地文件系统上的目录一样。
内存要求
Cloud Storage 卷装载使用 Cloud Run 容器内存执行以下活动:对于所有 Cloud Storage FUSE 缓存,Cloud Run 默认使用存留时间 (TTL) 为 60 秒的统计信息缓存设置。统计信息缓存的默认大小上限为 32 MB,类型缓存的默认大小上限为 4 MB。
读取时,Cloud Storage FUSE 还会消耗统计信息和类型缓存以外的内存,例如,为每个所读取的文件和 goroutine 使用 1 MiB 的数组。
写入 Cloud Storage 时,整个文件会先暂存到 Cloud Run 内存中,然后文件才会写入 Cloud Storage。
限制
Cloud Run 使用 Cloud Storage FUSE 进行此卷装载。因此,在将 Cloud Storage 存储桶作为卷进行装载时,有一些注意事项:
- Cloud Storage FUSE 不会为对同一文件的多次写入提供并发控制(文件锁定)。如果多次写入操作尝试替换某个文件,则最后一次写入的内容会生效,而先前写入的所有内容都会丢失。
- Cloud Storage FUSE 不是完全符合 POSIX 标准的文件系统。如需了解详情,请参阅 Cloud Storage FUSE 文档。
准备工作
您需要一个 Cloud Storage 存储桶来作为卷进行装载。
所需的角色
如需获得配置 Cloud Storage 卷装载所需的权限,请让您的管理员为您授予以下 IAM 角色:
-
Cloud Run 作业的 Cloud Run Developer (
roles/run.developer
) 角色 -
服务身份的 Service Account User (
roles/iam.serviceAccountUser
) 角色
如需获得服务身份访问文件和 Cloud Storage 存储桶所需的权限,请让您的管理员为服务身份授予以下 IAM 角色:
- Storage Admin (
roles/storage.admin
)
如需详细了解 Cloud Storage 角色和权限,请参阅适用于 Cloud Storage 的 IAM。
如需查看与 Cloud Run 关联的 IAM 角色和权限的列表,请参阅 Cloud Run IAM 角色和 Cloud Run IAM 权限。如果您的 Cloud Run 作业与 Google Cloud API(例如 Cloud 客户端库)进行交互,请参阅服务身份配置指南。如需详细了解如何授予角色,请参阅部署权限和管理访问权限。
不允许的路径
Cloud Run 不允许您在 /dev
、/proc
和 /sys
或其子目录上装载卷。
装载 Cloud Storage 卷
您可以在不同的装载路径中装载多个存储桶。您还可以跨容器使用相同或不同的装载路径将卷装载到多个容器。
如果您使用多个容器,请先指定卷,然后为每个容器指定卷装载。
gcloud
如需添加卷并装载,请运行以下命令:
gcloud beta run jobs update JOB \ --add-volume name=VOLUME_NAME,type=cloud-storage,bucket=BUCKET_NAME \ --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH
您需要在其中:
- 将
JOB
替换为作业的名称。 - 将 MOUNT_PATH 替换为您用于装载卷的相对路径,例如
/mnt/my-volume
。 - 将 VOLUME_NAME 替换为您要用于卷的任何名称。VOLUME_NAME 值用于将卷映射到卷装载。
- 将 BUCKET_NAME 替换为 Cloud Storage 存储桶的名称。
- 将
如需将卷装载为只读卷,请运行以下命令:
--add-volume=name=VOLUME_NAME,type=cloud-storage,bucket=BUCKET_NAME,readonly=true
如果您使用多个容器,请先指定卷,然后为每个容器指定卷装载:
gcloud beta run jobs update JOB \ --add-volume name=VOLUME_NAME,type=cloud-storage,bucket=BUCKET_NAME \ --container CONTAINER_1 \ --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH \ --container CONTAINER_2 \ --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH2
YAML
如果您要创建新的作业,请跳过此步骤。如果您要更新现有作业,请下载其 YAML 配置:
gcloud run jobs describe JOB_NAME --format export > job.yaml
根据需要更新 MOUNT_PATH、VOLUME_NAME、BUCKET_NAME 和 IS_READ_ONLY。
apiVersion: run.googleapis.com/v1 kind: Job metadata: name: JOB_NAME spec: metadata: annotations: run.googleapis.com/launch-stage: BETA template: metadata: annotations: run.googleapis.com/execution-environment: gen2 spec: template: spec: containers: - image: IMAGE_URL volumeMounts: - mountPath: MOUNT_PATH name: VOLUME_NAME volumes: - name: VOLUME_NAME csi: driver: gcsfuse.run.googleapis.com readOnly: IS_READ_ONLY volumeAttributes: bucketName: BUCKET_NAME
替换
- 将 IMAGE_URL 替换为对容器映像的引用,例如
us-docker.pkg.dev/cloudrun/container/hello:latest
。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
- 将 MOUNT_PATH 替换为您用于装载卷的相对路径,例如
/mnt/my-volume
。 - 将 VOLUME_NAME 替换为您要用于卷的任何名称。VOLUME_NAME 值用于将卷映射到卷装载。
- 将 IS_READ_ONLY 替换为
True
以将卷设为只读,或替换为False
以允许写入。 - 将 BUCKET_NAME 替换为 Cloud Storage 存储桶的名称。
- 将 IMAGE_URL 替换为对容器映像的引用,例如
使用以下命令将服务替换为其新配置:
gcloud beta run jobs replace job.yaml
读取和写入卷
如果您使用 Cloud Run 卷装载功能,则可以使用编程语言中用于在本地文件系统上读写文件的相同库来访问已装载的卷。
如果您使用的是期望数据存储在本地文件系统中并使用常规文件系统操作来访问数据的现有容器,此方法会特别有用。
以下代码段假定一个 mountPath
设置为 /mnt/my-volume
的卷装载。
Nodejs
使用文件系统模块创建新文件或附加到卷 /mnt/my-volume
中的现有文件:
var fs = require('fs'); fs.appendFileSync('/mnt/my-volume/sample-logfile.txt', 'Hello logs!', { flag: 'a+' });
Python
写入保存在卷 /mnt/my-volume
中的文件:
f = open("/mnt/my-volume/sample-logfile.txt", "a")
Go
使用 os
软件包创建一个保存在卷 /mnt/my-volume
中的新文件
f, err := os.Create("/mnt/my-volume/sample-logfile.txt")
Java
使用 Java.io.File
类在卷 /mnt/my-volume
中创建日志文件:
import java.io.File; File f = new File("/mnt/my-volume/sample-logfile.txt");
查看卷装载设置
控制台
在 Google Cloud 控制台中,进入 Cloud Run 作业页面:
点击相关作业以打开作业详情页面。
点击卷标签页。
在卷详情页面中找到卷装载设置。
gcloud
使用以下命令:
gcloud run jobs describe JOB_NAME
在返回的配置中找到卷装载设置。