本頁說明如何設定專用的記憶體內磁碟區,以便使用 Cloud Run 磁碟區掛接功能讀取及寫入檔案。請注意,這項功能與 Cloud Run 提供的內建記憶體內檔案系統不同。
在 Cloud Run 中掛接記憶體內磁碟區時,記憶體內磁碟區會顯示為容器檔案系統中的檔案。掛接記憶體內磁碟區後,您可以使用程式設計語言的檔案系統作業和程式庫,存取該磁碟區,就像存取本機檔案系統上的目錄一樣。
您可以使用記憶體內磁碟區執行下列操作:
- 限制記憶體內磁碟區的大小。限制磁碟區大小後,寫入已滿磁碟區的作業會失敗,這比 Cloud Run 因磁碟區耗用過多記憶體而終止執行個體要好。
- 在一個 Cloud Run 執行個體中,於不同容器之間共用記憶體內磁碟區。當 Cloud Run 擴展為服務的多個執行個體時,每個執行個體都會有自己的記憶體內磁碟區,該執行個體上的所有容器都會共用這個磁碟區。當 Cloud Run 擴充資源來處理流量時,所有容器都能使用這個磁碟區。
行為
建立記憶體內磁碟區時,建議指定大小限制。如果磁碟區達到大小上限,後續寫入作業就會因記憶體不足而失敗。執行個體可以處理這項錯誤並繼續執行。
請注意,大小限制只是限制,不會為記憶體內磁碟區分配額外空間。而是會耗用您為容器設定的記憶體。如果部署多個容器,每次寫入磁碟區的記憶體用量,都會計入寫入資料的容器記憶體用量。
如未指定大小限制,系統會自動設為工作或服務中所有容器總大小的一半。舉例來說,磁碟區大小 = [記憶體 (容器 A) + 記憶體 (容器 B) + 記憶體 (容器 N)]/2。emptyDir這項預設行為可能會導致記憶體內磁碟區的大小上限,高於為部分容器分配的記憶體。如果單一容器嘗試將更多資料寫入磁碟區,即使磁碟區大小尚未達到上限,容器本身也可能因超出分配到的記憶體而意外當機。
雖然設定大小限制是選用功能,但我們建議您設定大小限制,以免容器記憶體不足而當機。
不允許的路徑
Cloud Run 不允許您在 /dev、/proc 和 /sys 或其子目錄中掛接磁碟區。
必要的角色
如要取得設定及部署 Cloud Run 服務所需的權限,請要求系統管理員授予您下列 IAM 角色:
- Cloud Run 開發人員 (
roles/run.developer) 在 Cloud Run 服務上 - 服務身分上的服務帳戶使用者 (
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 導覽選單中選取「服務」,然後點選「部署容器」,設定新服務。如要設定現有服務,請按一下該服務,然後按一下「編輯及部署新的修訂版本」。
如要設定新服務,請填寫初始服務設定頁面,然後按一下「Containers, Networking, Security」(容器、網路、安全性) 展開服務設定頁面。
按一下「Volumes」(磁碟區) 分頁標籤。
- 按一下「掛接磁碟區」。
- 按一下「記憶體內」做為磁碟區類型。
- 在「Mount path」(掛接路徑) 欄位中,輸入要掛接磁碟區的路徑。
- 在「磁碟區名稱」欄位中輸入磁碟區名稱。
- 選用:輸入「大小限制」和「記憶體單位」,指定要指派給磁碟區的記憶體限制。這個上限必須低於為容器指定的總記憶體。這個磁碟區中儲存的資料會耗用資料寫入容器預留的記憶體。
- 按一下 [儲存]。
按一下 [Create] (建立) 或 [Deploy] (部署)。
gcloud
如要掛接磁碟區,請按照下列步驟操作:
gcloud beta 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。這個上限必須低於為容器指定的記憶體總量。
- IMAGE_URL:容器映像檔的參照,例如
使用下列指令建立或更新服務:
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 磁碟區掛接功能,可以透過程式設計語言中的相同程式庫存取已掛接的磁碟區,以便讀取及寫入本機檔案系統中的檔案。
如果您使用現有容器,且容器預期資料會儲存在本機檔案系統,並使用一般檔案系統作業存取資料,這個選項就特別實用。
下列程式碼片段假設磁碟區掛接點設為 /mnt/my-volume。mountPath
NodeJS
使用 File System 模組在磁碟區中建立新檔案,或附加至現有檔案,/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
如果您有多個容器,請按照 Sidecar CLI 慣例清除磁碟區和磁碟區掛接:
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