共用方式為


將容器化的 Python 應用程式部署至 App Service

本文是如何將 Python Web 應用程式容器化和部署至 Azure App Service 的教學課程的一部分。 App Service 可讓您執行容器化 Web 應用程式,並透過 Docker Hub、Azure Container Registry 和 Visual Studio Team Services 的持續整合/持續部署 (CI/CD) 功能進行部署。

在本教學課程的這個部分中,您將瞭解如何使用適用於容器的 App Service Web App ,將容器化 Python Web 應用程式部署至 App Service。 適用於容器的 Web 應用程式可讓您專注於撰寫容器,而不必擔心管理和維護基礎容器協調器。

完成本文中的步驟後,您將利用 Docker 容器映像檔製作一個 App Service 網站。 App Service 會使用受控識別從 Azure Container Registry 提取初始映射以進行驗證。

此服務圖表會醒目提示本文所涵蓋的元件。

教學課程中使用的服務的螢幕快照 —— 在 Azure 上容器化的 Python 應用程式,其中已醒目顯示部署路徑。

建立 Web 應用程式

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

  1. 使用 az group show 命令,取得包含 Azure Container Registry 之群組的資源標識符。

    # RESOURCE_GROUP_NAME='msdocs-web-app-rg'
    
    RESOURCE_ID=$(az group show \
      --resource-group $RESOURCE_GROUP_NAME \
      --query id \
      --output tsv)
    echo $RESOURCE_ID
    

    您的環境中仍應將RESOURCE_GROUP_NAME設定為您在 第 3 部分使用的資源組名。在本教學課程的 Azure 中建置容器。 如果不是,請取消批注第一行,並將它設定為您使用的名稱。

  2. 使用 az appservice plan create 命令 建立 App Service 方案。

    APP_SERVICE_PLAN_NAME='msdocs-web-app-plan'
    
    az appservice plan create \
        --name $APP_SERVICE_PLAN_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --sku B1 \
        --is-linux
    
  3. 使用 "az webapp create" 命令 建立網頁應用程式。

    下列命令也會為 Web 應用程式啟用 系統指派的受控識別,並在指定的資源上 指派 角色,在此案例中為包含 Azure Container Registry 的資源群組。 這會授與資源群組中任何 Azure Container Registry 的系統指派受控識別提取許可權。

    APP_SERVICE_NAME='<website-name>'
    # REGISTRY_NAME='<your Azure Container Registry name>'
    CONTAINER_NAME=$REGISTRY_NAME'.azurecr.io/msdocspythoncontainerwebapp:latest'
    
    az webapp create \
      --resource-group $RESOURCE_GROUP_NAME \
      --plan $APP_SERVICE_PLAN_NAME \
      --name $APP_SERVICE_NAME \
      --assign-identity '[system]' \
      --scope $RESOURCE_ID \
      --role acrpull \
      --deployment-container-image-name $CONTAINER_NAME 
    

    哪裡:

    • APP_SERVICE_NAME必須是全域唯一的,因為它會成為URL中的網站名稱,https://<website-name>.azurewebsites.net
    • CONTAINER_NAME的格式為 「yourregistryname.azurecr.io/repo_name:tag」。
    • 您的環境中仍應將REGISTRY_NAME設定為您在第 3 部分 中使用的登錄名稱。在本教學課程的 Azure 中建置容器。 如果不是,請取消註解代碼中設定的那一行,並將它設定為您所使用的名稱。

    注意

    執行 命令時,您可能會看到類似下列的錯誤:

    No credential was provided to access Azure Container Registry. Trying to look up...
    Retrieving credentials failed with an exception:'No resource or more than one were found with name ...'
    

    因為 Web 應用程式預設使用 Azure Container Registry 的系統管理員認證向登錄進行驗證,而且登錄上尚未啟用管理員認證,因此會發生此錯誤。 您可以放心地忽略此錯誤,因為您會在下一個命令中將 Web 應用程式設定為使用系統指派的受控識別進行驗證。

設定受管理的身份識別和 Webhook

  1. 將 Web 應用程式設定為使用受控身分從 Azure Container Registry 拉取,並使用 az webapp config set 命令。

    az webapp config set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --generic-configurations '{"acrUseManagedIdentityCreds": true}'
    

    因為您在建立 Web 應用程式時已啟用系統指派的受控識別,所以它會是用來從 Azure Container Registry 提取的受控識別。

  2. 使用 az webapp deployment list-publishing-credentials 命令,取得應用程式範圍認證。

    CREDENTIAL=$(az webapp deployment list-publishing-credentials \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --query publishingPassword \
      --output tsv)
    echo $CREDENTIAL 
    
  3. 使用應用程式範圍認證,使用 az acr webhook create 命令 建立 Webhook。

    SERVICE_URI='https://$'$APP_SERVICE_NAME':'$CREDENTIAL'@'$APP_SERVICE_NAME'.scm.azurewebsites.net/api/registry/webhook'
    
    az acr webhook create \
      --name webhookforwebapp \
      --registry $REGISTRY_NAME \
      --scope msdocspythoncontainerwebapp:* \
      --uri $SERVICE_URI \
      --actions push 
    

    根據預設,此命令會在與指定的 Azure Container Registry 相同的資源群組和位置中建立 Webhook。 如有需要,您可以使用 --resource-group--location 參數來覆寫此行為。

設定與 MongoDB 的連線

在此步驟中,您會指定連線到 MongoDB 所需的環境變數。

如果您需要為 MongoDB 建立 Azure Cosmos DB,我們建議您遵循本教學課程的第 2 部分「本機建置及測試容器」中的步驟,設定適用於 MongoDB 的 Cosmos DB。 當您完成後,您應該會擁有一個用於 MongoDB 的 Azure Cosmos DB 連接字串,其格式為 mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>

您需要 MongoDB 連接字串,才能遵循下列步驟。

若要在 App Service 中設定環境變數,請使用下列 az webapp config appsettings set 命令建立 應用程式設定。

MONGO_CONNECTION_STRING='your Mongo DB connection string in single quotes'
MONGO_DB_NAME=restaurants_reviews
MONGO_COLLECTION_NAME=restaurants_reviews

az webapp config appsettings set \
   --resource-group $RESOURCE_GROUP_NAME \
   --name $APP_SERVICE_NAME \
   --settings CONNECTION_STRING=$MONGO_CONNECTION_STRING \
              DB_NAME=$MONGO_DB_NAME  \
              COLLECTION_NAME=$MONGO_COLLECTION_NAME 
  • CONNECTION_STRING:開頭為 “mongodb://”的連接字串。
  • DB_NAME:使用「restaurants_reviews」。
  • COLLECTION_NAME:使用「restaurants_reviews」。

瀏覽網站

若要確認網站正在執行中,請移至 https://<website-name>.azurewebsites.net;其中網站名稱是您的應用程式服務名稱。 如果成功,您應該會看到餐廳檢閱範例應用程式。 網站可能需要一些時間才能第一次啟動。 當網站出現時,請新增餐廳,並檢閱該餐廳,以確認範例應用程式正常運作。

如果您在本機執行 Azure CLI,您可以使用 az webapp browse 命令來瀏覽至網站。 如果您使用 Cloud Shell,請開啟瀏覽器視窗並瀏覽至網站 URL。

az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME 

注意

Cloud Shell 不支援 az webapp browse 命令。 開啟瀏覽器視窗,然後瀏覽至該網站的網址。

部署疑難排解

如果您沒有看到範例應用程式,請嘗試下列步驟。

  • 使用容器部署和 App Service,請始終在 Azure 入口網站中查看 部署中心 / 記錄 頁面。 確認容器已拉取並正在運行中。 容器的初始拉取和執行可能需要一些時間。
  • 嘗試重新啟動App Service,並查看這是否解決了您的問題。
  • 如果有程式設計錯誤,這些錯誤會顯示在應用程式記錄中。 在 App Service 的 Azure 入口網站頁面上,選取 [診斷並解決問題/應用程式記錄]。
  • 範例應用程式依賴 MongoDB 的連線。 確認 App Service 具有具有正確連線資訊的應用程式設定。
  • 確認 App Service 已啟用受控識別,並用於部署中心。 在 App Service 的 Azure 入口網站頁面上,移至 App Service 部署中心 資源,並確認 驗證 已設定為 受控識別
  • 檢查是否已在 Azure Container Registry 中定義 Webhook。 Webhook 可讓 App Service 提取容器映像。 特別是,檢查服務 URI 是否以 “/api/registry/webhook” 結尾。
  • 不同的 Azure 容器註冊表 SKU 具有不同的功能,包括 Webhook 數目。 如果您要重複使用現有的登錄表冊,您可能會看到下列訊息:「針對登錄 SKU 基本的網路掛鉤資源類型超過配額。」 深入瞭解不同的 SKU 配額和升級程式:https://aka.ms/acr/tiers"。 如果您看到此訊息,請使用新的註冊表,或減少目前使用中的 註冊表 Webhook 數目

下一步