Share via


使用 Azure Container Apps 和 PostgreSQL 建置和部署 Python Web 應用程式

本文是如何將 Python Web 應用程式容器化和部署至 Azure Container Apps 的教學課程的一部分。 Container Apps 可讓您部署容器化應用程式,而不需要管理複雜的基礎結構。

在本教學課程的這個部分中,您將瞭解如何容器化和部署 Python 範例 Web 應用程式(Django 或 Flask)。 具體而言,您會在雲端中建置容器映像,並將其部署至 Azure Container Apps。 您可以定義環境變數,讓容器應用程式能夠連線到 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器實例,其中範例應用程式會儲存數據。

此服務圖表醒目提示本文所涵蓋的元件:建置和部署容器映射。

A screenshot of the services in the Tutorial - Deploy a Python App on Azure Container Apps. Section highlighted is what is covered in this article.

取得範例應用程式

分叉並將範例程式代碼複製到您的開發人員環境。

步驟 1: 移至範例應用程式的 GitHub 存放庫(DjangoFlask),然後選取 [分支]。

請遵循步驟將目錄分支至您的 GitHub 帳戶。 您也可以直接將程式代碼存放庫下載到本機計算機,而不需分手或 GitHub 帳戶,不過,您將無法設定本教學課程稍後討論的 CI/CD。

步驟 2。 使用 git clone 命令,將分支存放庫複製到 python-container 資料夾:

# Django
git clone https://github.com/$USERNAME/msdocs-python-django-azure-container-apps.git python-container

# Flask
# git clone https://github.com/$USERNAME/msdocs-python-flask-azure-container-apps.git python-container

步驟 3。 變更目錄。

cd python-container

從 Web 應用程式程式代碼建置容器映像

遵循這些步驟之後,您將會有一個 Azure Container Registry,其中包含從範例程式代碼建置的 Docker 容器映像。

Azure CLI 命令可以在 Azure Cloud Shell 或已安裝 Azure CLI工作站上執行。

步驟 1: 使用 az group create 命令來建立資源群組。

az group create \
--name pythoncontainer-rg \
--location <location>

<location> 是命令az account list-locations -o table輸出的其中一個 Azure 位置 Name 值。

步驟 2。 使用 az acr create 命令建立容器登錄。

az acr create \
--resource-group pythoncontainer-rg \
--name <registry-name> \
--sku Basic \
--admin-enabled

<registry-name> 在 Azure 內必須是唯一的,且包含 5-50 個英數位元。

您可以使用下列項目來檢視為系統管理員建立的認證:

az acr credential show \
--name <registry-name> \
--resource-group pythoncontainer-rg

步驟 3。 使用 az acr login 命令登入登錄。

az acr login --name <registry-name>

命令會將 「azurecr.io」 新增至名稱,以建立完整登錄名稱。 如果成功,您會看到「登入成功」訊息。 如果您要從與建立登錄所在的訂用帳戶不同的訂用帳戶存取登錄,請使用 --suffix 參數。

步驟 4. 使用 az acr build 命令建 置映像。

az acr build \
--registry <registry-name> \
--resource-group pythoncontainer-rg \
--image pythoncontainer:latest .

請注意:

  • 命令結尾的點 (“.”) 表示要建置的原始碼位置。 如果您未在範例應用程式根目錄中執行此命令,請指定程式代碼的路徑。

  • 如果您在 Azure Cloud Shell 中執行 命令,請使用 git clone 先將存放庫提取到 Cloud Shell 環境,然後將目錄變更為專案的根目錄,以便正確解譯點 (“.”)。

  • 如果您省略 [ -t 相同 --image] 選項,命令會將本機內容組建排入佇列,而不會將它推送至登錄。 在沒有推送的情況下建置對於檢查映像是否建置很有用。

步驟 5: 使用 az acr repository list 命令確認容器映射已建立

az acr repository list --name <registry-name>

建立 PostgreSQL 彈性伺服器實例

範例應用程式 (DjangoFlask) 會將餐廳檢閱資料儲存在 PostgreSQL 資料庫中。 在這些步驟中,您會建立將包含資料庫的伺服器。

Azure CLI 命令可以在 Azure Cloud Shell 或已安裝 Azure CLI工作站上執行。

步驟 1: 使用 az postgres flexible-server create 命令在 Azure 中建立 PostgreSQL 伺服器。 此命令執行幾分鐘才能完成並不罕見。

az postgres flexible-server create \
   --resource-group pythoncontainer-rg \
   --name <postgres-server-name>  \
   --location <location> \
   --admin-user <admin-username> \
   --admin-password <admin-password> \
   --sku-name Standard_D2s_v3 \
   --public-access 0.0.0.0 
  • “pythoncontainer-rg” →本教學課程中使用的資源組名。 如果您使用不同的名稱,請變更此值。

  • <postgres-server-name> → PostgreSQL 資料庫伺服器名稱。 此名稱在所有 Azure 中都必須是唯一的。 伺服器端點為 「https://< postgres-server-name.postgres.database.azure.com>」。。 允許的字元為 “A”-“Z”、“0”-“9” 和 “-”。

  • <location> → 使用用於 Web 應用程式的相同位置。 <location> 是命令az account list-locations -o table輸出的其中一個 Azure 位置 Name 值。

  • <admin-username> →系統管理員帳戶的用戶名稱。 它不能是 “azure_superuser”、“admin”、“administrator”、“root”、“guest” 或 “public”。 在本教學課程中使用 「demoadmin」。

  • <系統管理員使用者的 admin-password 密碼> 。 它必須包含下列三個類別的8到128個字元:英文大寫字母、英文小寫字母、數位和非英數位元。

    重要

    建立使用者名稱或密碼 時,不會 使用 “$” 字元。 稍後,您會使用這些值建立環境變數,其中 “$” 字元在用來執行 Python 應用程式的 Linux 容器中具有特殊意義。

  • <sku-name> →定價層和計算組態的名稱,例如“Standard_D2s_v3”。 如需詳細資訊,請參閱 適用於 PostgreSQL 的 Azure 資料庫 定價。 若要列出可用的 SKU, 請使用 az postgres flexible-server list-skus --location <location>

  • <public-access> →使用 「0.0.0.0」,允許從任何 Azure 服務公開存取伺服器,例如 Container Apps。

注意

如果您打算使用 Azure CLI 以外的工具從本機工作站使用 PostgreSQL 伺服器,您必須使用 az postgres flexible-server firewall-rule create 命令來新增防火牆規則。

在伺服器上建立資料庫

此時,您有 PostgreSQL 伺服器。 在本節中,您會在伺服器上建立資料庫。

您可以在本機環境中,或在 Azure Cloud Shell 中使用 PostgreSQL 互動式終端機 psql,這也可以在 Azure 入口網站存取。 使用 psql 時,使用 Cloud Shell 通常比較容易,因為殼層中包含所有相依性。

步驟 1: 使用 psql 將 連線 至資料庫。

psql --host=<postgres-server-name>.postgres.database.azure.com \
     --port=5432 \
     --username=demoadmin@<postgres-server-name> \
     --dbname=postgres

其中 <postgres-server-name> 是 PostgreSQL 伺服器的名稱。 此命令會提示您輸入系統管理員密碼。

如果您無法連線,請重新啟動資料庫,然後再試一次。 如果您要從本機環境連線,您的IP位址必須新增至資料庫服務的防火牆規則清單。

步驟 2。 建立資料庫。

postgres=> 提示字元中輸入:

CREATE DATABASE restaurants_reviews;

命令結尾的分號 (“;”) 是必要的。 若要確認資料庫已成功建立,請使用 命令 \c restaurants_reviews。 輸入 \? 以顯示說明或 \q 結束。

您也可以連線到 Azure PostgreSQL 彈性伺服器,並使用 Azure Data Studio 或任何其他支援 PostgreSQL 的 IDE 來建立資料庫。

將 Web 應用程式部署至容器應用程式

容器應用程式會部署至容器應用程式 環境,其可作為安全界限。 在下列步驟中,您會建立環境、環境內的容器,並設定容器,讓網站在外部可見。

步驟 1: 視需要登入 Azure 並進行驗證。

az login

步驟 2。 使用 az extension add 命令安裝或升級 Azure Container Apps 的擴充功能。

az extension add --name containerapp --upgrade

步驟 3。 使用 az containerapp env create 命令建立 Container Apps 環境。

az containerapp env create \
--name python-container-env \
--resource-group pythoncontainer-rg \
--location <location>

<location> 是命令az account list-locations -o table輸出的其中一個 Azure 位置 Name 值。

步驟 4. 取得 Azure Container Registry 的登入認證。

az acr credential show -n <registry-name>

使用使用者名稱和命令輸出傳回的其中一個密碼。

步驟 5: 使用 az containerapp create 命令在環境中建立 容器應用程式。

az containerapp create \
--name python-container-app \
--resource-group pythoncontainer-rg \
--image <registry-name>.azurecr.io/pythoncontainer:latest \
--environment python-container-env \
--ingress external \
--target-port 8000 \
--registry-server <registry-name>.azurecr.io \
--registry-username <registry-username> \
--registry-password <registry-password> \
--env-vars <env-variable-string>
--query properties.configuration.ingress.fqdn

<env-variable-string> 是由 key=“value” 格式中空格分隔值的字串,其中包含下列值。

  • AZURE_POSTGRESQL_HOST=<postgres-server-name.postgres.database.azure.com>
  • AZURE_POSTGRESQL_DATABASE=restaurants_reviews
  • AZURE_POSTGRESQL_USERNAME=demoadmin
  • AZURE_POSTGRESQL_PASSWORD=<db-password>
  • RUNNING_IN_PRODUCTION=1
  • AZURE_SECRET_KEY=<YOUR-SECRET-KEY>

使用的python -c 'import secrets; print(secrets.token_hex())'輸出產生AZURE_SECRET_KEY值。

範例如下:--env-vars AZURE_POSTGRESQL_HOST="my-postgres-server.postgres.database.azure.com" AZURE_POSTGRESQL_DATABASE="restaurants_reviews" AZURE_POSTGRESQL_USERNAME="demoadmin" AZURE_POSTGRESQL_PASSWORD="somepassword" RUNNING_IN_PRODUCTION="1" AZURE_SECRET_KEY=asdfasdfasdf

步驟 7。 僅限 Django,請移轉和建立資料庫架構。 (在 Flask 範例應用程式中,它會自動完成,您可以略過此步驟。

使用 az containerapp exec 命令 連線:

az containerapp exec \
--name python-container-app \
--resource-group pythoncontainer-rg

然後,在殼層命令提示字元中輸入 python manage.py migrate

您不需要移轉容器的修訂。

步驟 8。 測試網站。

az containerapp create您先前輸入的命令會輸出可用來瀏覽至應用程式的應用程式URL。 URL 結尾為 「azurecontainerapps.io」。。 瀏覽至瀏覽器中的 URL。 或者,您可以使用 az containerapp browse 命令。

以下是新增餐廳后範例網站和兩個評論的範例。

Screenshot showing an example of the sample website built in this tutorial.

針對部署進行疑難排解

  • 您忘記了應用程式 URL 來存取網站。

    • 在 Azure 入口網站 中,移至容器應用程式的 [概觀] 頁面,並尋找應用程式 URL
    • 在 VS Code 中,移至 Azure 擴充功能,然後選取 [容器應用程式 ] 區段。 展開訂用帳戶、展開容器環境,以及當您找到容器應用程式時,以滑鼠右鍵按兩下 python-container-app ,然後選取 [ 流覽]。
    • 在 Azure CLI 中,使用 az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn 命令。
  • 在 VS Code 中,Azure 工作中建置映像會傳回錯誤。

    • 如果您看到「錯誤:無法下載內容」訊息。 請檢查 URL 是否不正確。“在 VS Code 輸出 視窗中,然後重新整理 Docker 延伸模組中的登錄。 若要重新整理,請選取 Docker 擴充功能,移至 [登錄] 區段,尋找登錄並加以選取。
    • 如果您再次在 Azure 中執行建置映像,請檢查先前執行中的登錄是否存在,如果是的話,請使用它。
  • 在建立容器應用程式期間 Azure 入口網站 中,您會看到包含「無法存取 ACR 』<name.azurecr.io>』」 的存取錯誤。

    • 當 ACR 上的系統管理員認證停用時,就會發生此錯誤。 若要在入口網站中檢查系統管理員狀態,請移至您的 Azure Container Registry,選取 [存取金鑰] 資源,並確定已啟用 管理員 使用者
  • 您的容器映像不會出現在 Azure Container Registry 中。

    • 檢查 Azure CLI 命令或 VS Code 輸出的輸出,並尋找訊息以確認成功。
    • 使用 Azure CLI 或 VS Code 工作提示,檢查您的組建命令中已正確指定登錄的名稱。
    • 請確定您的認證未過期。 例如,在 VS Code 中,在 Docker 擴充功能中尋找目標登錄並重新整理。 在 Azure CLI 中,執行 az login
  • 網站會傳回「不正確的要求(400)」。

    • 檢查傳入至容器的PostgreSQL環境變數。 400 錯誤通常表示 Python 程式代碼無法連線到 PostgreSQL 實例。
    • 本教學課程中使用的範例程式代碼會檢查容器環境變數 RUNNING_IN_PRODUCTION是否存在,其可設定為任何值,例如 “1”。
  • 網站會傳回「找不到」(404)。

    • 檢查容器的 [概觀] 頁面上的應用程式 URL。 如果應用程式 URL 包含 「internal」 這個字,則輸入未正確設定。
    • 檢查容器的輸入。 例如,在 Azure 入口網站 中,移至容器的輸入資源,並確定已啟用 HTTP 輸入,並選取 [接受來自任何地方的流量]。
  • 網站未啟動,您會看到「串流逾時」,或未傳回任何專案。

    • 檢查記錄。
      • 在 Azure 入口網站 中,移至容器應用程式的修訂管理資源,並檢查容器的 [布建狀態]。
        • 如果為「布建」,請等到布建完成為止。
        • 如果為「失敗」,請選取修訂並檢視控制台記錄。 選擇要顯示「產生時間」、「Stream_s」和「Log_s」的數據行順序。 先依最新的記錄排序,並在 「Stream_s」 資料行中尋找 Python stderrstdout 訊息。 Python 'print' 輸出將會是 stdout 訊息。
      • 使用 Azure CLI 時,請使用 az containerapp logs show 命令。
    • 如果使用 Django 架構,請檢查資料庫中是否有 restaurants_reviews 數據表。 如果沒有,請使用主控台來存取容器並執行 python manage.py migrate

後續步驟