共用方式為


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

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

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

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

教學課程 - 在 Azure Container Apps 上部署 Python 應用程式的螢幕快照。醒目提示的區段是本文所涵蓋的內容。

取得範例應用程式

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

步驟 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” 和 “-”。

  • <位置> → 使用用於 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 命令。

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

顯示本教學課程中建置範例網站的螢幕快照。

針對部署進行疑難排解

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

    • 在 Azure 入口網站 中,移至容器應用程式的 [概觀] 頁面,並尋找應用程式 URL
    • 在 VS Code 中 ,移至 Azure 檢視 (Ctrl+Shift+A),然後展開您正在使用的訂用帳戶。 展開 [ 容器應用程式 ] 節點,然後展開受控環境,然後以滑鼠右鍵按兩下 python-container-app ,然後選取 [ 瀏覽]。 它會使用 應用程式 URL 開啟瀏覽器。
    • 在 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

後續步驟