本頁面說明如何設定專用的記憶體內磁碟區,以便使用 Cloud Run 磁碟區掛接進行檔案讀取和寫入。請注意,這項功能與 Cloud Run 內建的記憶體內檔案系統不同。
在 Cloud Run 掛接記憶體內磁碟區時,該磁碟區會顯示為容器檔案系統中的檔案。掛接記憶體內磁碟區後,您可以使用程式設計語言的檔案系統作業和程式庫,像存取本機檔案系統上的目錄一樣存取該磁碟區。
記憶體內磁碟區可用於以下用途:
- 限制記憶體內磁碟區的大小。限制磁碟區大小後,寫入完整磁碟區的作業會失敗,這比 Cloud Run 因磁碟區耗用過多記憶體而終止執行個體更理想。
行為
建立記憶體內磁碟區時,建議您指定大小限制。如果磁碟區達到大小上限,後續寫入作業會失敗,並顯示記憶體不足錯誤。執行個體可以處理這項錯誤,並繼續執行。
請注意,大小限制只是限制,不會為記憶體內磁碟區分配額外空間。而是會耗用您為容器設定的記憶體。如果部署多個容器,每次寫入磁碟區所用的記憶體,都會計入寫入資料的容器記憶體用量。
如未指定大小限制,系統會自動將其設為服務中所有容器總大小的一半。例如,emptyDir 磁碟區大小 = [記憶體 (容器 A) + 記憶體 (容器 B) + 記憶體 (容器 N)]/2。這項預設行為可能會導致記憶體內磁碟區的大小限制,高於分配給部分容器的記憶體。如果單一容器在嘗試將更多資料寫入磁碟區時,超過其分配的記憶體,即使尚未達到磁碟區大小限制,也可能導致非預期的當機。
雖然設定大小限制為選用步驟,但建議您設定限制,以免容器記憶體不足而當機。
禁止的路徑
Cloud Run 不允許在 /dev、/proc 和 /sys 或其子目錄中掛接磁碟區。
必要的角色
如要取得設定及部署 Cloud Run 服務所需的權限,請要求管理員授予您下列 IAM 角色:
- Cloud Run 服務的 Cloud Run 開發人員 (
roles/run.developer) - 服務身分的服務帳戶使用者 (
roles/iam.serviceAccountUser)
如果您是從原始碼部署服務或函式,則必須在專案和 Cloud Build 服務帳戶中取得其他角色。
如要查看與 Cloud Run 相關聯的 IAM 角色和權限清單,請參閱「Cloud Run IAM 角色」和「Cloud Run IAM 權限」。如果 Cloud Run 服務與Google Cloud API (例如 Cloud 用戶端程式庫) 互動,請參閱服務身分設定指南。如要進一步瞭解如何授予角色,請參閱部署權限和管理存取權。
設定記憶體內磁碟區
任何設定變更都會建立新的修訂版本。後續修訂版本也會自動套用這項設定,除非您明確變更。為 Cloud Run 服務設定記憶體內磁碟區後,系統會為每個啟動的 Cloud Run 執行個體建立空白磁碟區,且只要執行個體在運作中,磁碟區就會存在。執行個體停止運作時,磁碟區中的資料會永久刪除。
控制台
前往 Google Cloud 控制台的「Cloud Run」頁面:
從 Cloud Run 導覽選單中選取「Services」(服務):
如要設定新服務,請按一下「Deploy container」(部署容器),然後填寫初始服務設定頁面。接著,按一下「Containers, Networking, Security」(容器、網路、安全性) 展開服務設定頁面,然後點選「Volumes」(磁碟區)。
如要設定現有服務,請按一下該服務,然後按一下「Containers」(容器) 分頁標籤。
按一下「Mount volume」。
按一下「In-memory」做為磁碟區類型。
在「Mount path」(掛接路徑) 欄位中,輸入要掛接磁碟區的路徑。
選用:輸入「Size limit」(大小限制) 和「Memory unit」(記憶體單位),指定要指派給磁碟區的記憶體限制。這項限制必須小於為容器指定的記憶體總量。這個磁碟區中儲存的資料會耗用資料寫入容器預留的記憶體。
按一下 [儲存]。
按一下「建立」,建立新服務。依序點選「查看差異並重新部署」和「部署變更」,即可更新現有服務。
gcloud
如要掛接磁碟區,請按照下列步驟操作:
gcloud run services update SERVICE \ --add-volume mount-path=MOUNT_PATH,type=in-memory,size-limit=SIZE_LIMIT
更改下列內容:
- SERVICE:服務名稱。
- MOUNT_PATH:容器檔案系統中要掛接這個磁碟區的相對路徑,例如
/mnt/my-volume。 - SIZE_LIMIT:要指派給磁碟區的記憶體限制,以 MiB 或 GiB 為單位 (指定為 Mi 或 Gi),例如
500Mi。這項限制必須小於為容器指定的記憶體總量。
如果您使用多個容器,請先指定磁碟區,然後指定每個容器的磁碟區掛接:
gcloud run services update SERVICE \ --add-volume=name= VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \ --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 services describe SERVICE --format export > service.yaml
按照下圖所示,設定
volumeMounts和volumes屬性:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE_NAME spec: template: spec: containers: - image: IMAGE_URL volumeMounts: - mountPath: MOUNT_PATH name: VOLUME_NAME volumes: - name: VOLUME_NAME emptyDir: sizeLimit: SIZE_LIMIT medium: Memory
更改下列內容:
IMAGE_URL:容器映像檔的參照,例如us-docker.pkg.dev/cloudrun/container/hello:latest。如果使用 Artifact Registry,則必須預先建立存放區 REPO_NAME。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG。- VOLUME_NAME:磁碟區名稱,可任意命名。VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接。
MOUNT_PATH:容器檔案系統中要掛接這個磁碟區的相對路徑,例如/mnt/my-volume。- SIZE_LIMIT:要指派給磁碟區的記憶體限制,以 MiB 或 GiB 為單位 (指定為 Mi 或 Gi),例如
500Mi。這項限制必須小於為容器指定的記憶體總量。
使用下列指令建立或更新服務:
gcloud run services replace service.yaml
gcloud run services replace指令預設會使用service.yaml檔案 (如有)。
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
在 Terraform 設定中,將下列內容新增至google_cloud_run_v2_service 資源:resource "google_cloud_run_v2_service" "default" {
name = "SERVICE_NAME"
location = "REGION"
template {
containers {
image = "IMAGE_URL"
volume_mounts {
name = "VOLUME_NAME"
mount_path = "MOUNT_PATH"
}
}
volumes {
name = "VOLUME_NAME"
empty_dir {
medium = "MEMORY"
size_limit = "SIZE_LIMIT"
}
}
}
}
更改下列內容:
- SERVICE_NAME:Cloud Run 服務的名稱。
- REGION: Google Cloud 區域。例如:
europe-west1。 IMAGE_URL:容器映像檔的參照,例如us-docker.pkg.dev/cloudrun/container/hello:latest。如果使用 Artifact Registry,則必須預先建立存放區 REPO_NAME。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG。- VOLUME_NAME:磁碟區名稱,可任意命名。VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接。
- MOUNT_PATH:容器檔案系統中要掛接這個磁碟區的相對路徑,例如
/mnt/my-volume。 - SIZE_LIMIT:要指派給磁碟區的記憶體限制,以 MiB 或 GiB 為單位 (指定為 Mi 或 Gi),例如
500Mi。這項限制必須小於為容器指定的記憶體總量。
撰寫
如要在 compose.yaml 檔案中指定記憶體內磁碟區掛接,請使用 Google 專屬擴充功能 x-google-cloudrun:volume-type: in-memory。
services: web: image: IMAGE volumes: - VOLUME_NAME:MOUNT_PATH volumes: VOLUME_NAME: x-google-cloudrun: volume-type: in-memory
更改下列內容:
- IMAGE:容器映像檔的網址。
- VOLUME_NAME:記憶體內磁碟區的名稱。
- MOUNT_PATH:要掛接磁碟區的路徑,例如
/mnt/my-volume。
部署服務
如要部署服務,請執行
gcloud run compose up指令:gcloud run compose up compose.yaml請按照提示
y安裝必要元件或啟用 API。選用:如要允許未經驗證的使用者存取服務,請公開服務。
部署完成後,系統會顯示 Cloud Run 服務網址。複製這個網址並貼到瀏覽器,即可查看執行中的容器。您可以在 Google Cloud 控制台停用預設驗證。
讀取及寫入磁碟區
如果您使用 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");清除及移除磁碟區和磁碟區掛接
您可以清除所有磁碟區和掛接點,也可以移除個別磁碟區和磁碟區掛接點。
清除所有磁碟區和磁碟區掛接
如要清除單一容器服務中的所有磁碟區和磁碟區掛接,請執行下列指令:
gcloud run services update SERVICE \ --clear-volumes \ --clear-volume-mounts
gcloud run services update SERVICE \ --container=container1 \ --clear-volumes \ --clear-volume-mounts \ --container=container2 \ --clear-volumes \ --clear-volume-mounts
移除個別磁碟區和磁碟區掛接
如要移除磁碟區,您也必須移除使用該磁碟區的所有磁碟區掛接。
如要移除個別磁碟區或磁碟區掛接,請使用 remove-volume 和 remove-volume-mount 旗標:
gcloud run services update SERVICE \ --remove-volume VOLUME_NAME \ --container=container1 \ --remove-volume-mount MOUNT_PATH \ --container=container2 \ --remove-volume-mount MOUNT_PATH