將容器化的 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 提取初始映射以進行驗證。
此服務圖表會醒目提示本文所涵蓋的元件。
建立 Web 應用程式
Azure CLI 命令可以在 Azure Cloud Shell 或已安裝 Azure CLI 的工作站上執行。
使用 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 中建置容器。 如果不是,請取消批注第一行,並將它設定為您使用的名稱。
使用 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
使用 "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 應用程式設定為使用系統指派的受控識別進行驗證。
- APP_SERVICE_NAME必須是全域唯一的,因為它會成為URL中的網站名稱,
設定受管理的身份識別和 Webhook
將 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 提取的受控識別。
使用 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
使用應用程式範圍認證,使用 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 中設定環境變數,請使用下列
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 數目。