本文是有关如何容器化 Python Web 应用并将其部署到
Azure 容器应用的
教程的一部分。 容器应用使你无需管理复杂的基础结构即可部署容器化应用。
本教程的这一部分介绍如何 (Django 或 Flask) 容器化和部署 Python 示例 Web 应用。 具体而言,你将在云中生成容器映像,并将其部署到 Azure 容器应用。 你将定义环境变量,使容器应用能够连接到
Azure Database for PostgreSQL灵活服务器
实例,示例应用在其中存储数据。
下面显示的服务关系图突出显示了本文中介绍的组件:生成和部署容器映像。
为清楚起见,本教程中的命令行显示在 Bash shell 中的多行上。 对于其他 shell 类型,请根据需要更改续行符。 例如,对于 PowerShell,请使用 back tick (“'”) 。 或者删除续行符,在一行中输入命令。
获取示例应用
为示例代码创建分支并将其克隆到开发人员环境。
步骤 1。
转到示例应用的 GitHub 存储库, (
Django
或
Flask
) ,然后选择“
分支
”。
按照步骤将目录分支到 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 容器注册表,其中包含根据示例代码生成的 Docker 容器映像。
Azure 门户
VS Code
Azure CLI
资源组 →创建名为 pythoncontainer-rg 的新资源组。
注册表名称 → 注册表名称在 Azure 中必须是唯一的,并且包含 5-50 个字母数字字符。
位置 →选择位置。
SKU →选择 “标准”。
完成后,选择“查看 + 创建”。 验证完成后,选择“ 创建”。
步骤 6. 使用 az acr build 命令从存储库生成映像。
az acr build --registry <registry-name> \
--resource-group pythoncontainer-rg \
--image pythoncontainer:latest <repo-path>
将 registry-name> 指定<为创建的注册表的名称。 对于 <存储库路径>,请选择 Django 或 Flask 存储库路径。
命令完成后,转到注册表的 存储库 资源,并确认图像显示。
将图像标记为 →输入 pythoncontainer:latest。
创建新注册表 →选择此选项可创建新注册表。
注册表名称 → 注册表名称在 Azure 中必须是唯一的,并且包含 5-50 个字母数字字符。
选择 SKU →选择“ 基本”。
创建新资源组 → 选择此选项可创建资源组。
资源组 →创建名为 pythoncontainer-rg 的新资源组。
位置 → 选择一个位置,等待几秒,等待基本映像 OS 的最终提示。
选择操作系统 →选择 Linux。
如果在 “输出 ”窗口中看到错误,请参阅 故障排除部分。
步骤 4. 使用 az acr update 命令为注册表启用管理员用户帐户。 可以在Visual Studio Code终端窗口或 Azure Cloud Shell中运行命令。
az acr update --name <registry-name> \
--resource-group pythoncontainer-rg \
--admin-enabled true
或者,在 Docker 扩展中选择注册表,右键单击并选择“ 在门户中打开 ”以启用管理员用户帐户。 请参阅本文门户选项卡中的说明。
可以使用以下命令查看为管理员创建的凭据:
az acr credential show \
--name <registry-name> \
--resource-group pythoncontainer-rg
<registry-name> 在 Azure 中必须是唯一的,并且包含 5-50 个字母数字字符。
可以使用以下命令查看为管理员创建的凭据:
az acr credential show \
--name <registry-name> \
--resource-group pythoncontainer-rg
--registry <registry-name> \
--resource-group pythoncontainer-rg \
--image pythoncontainer:latest .
点 (“。”命令末尾的) 指示要生成的源代码的位置。 如果未在示例应用根目录中运行此命令,请指定代码的路径。
如果在 Azure Cloud Shell中运行 命令,请使用 git clone
首先将存储库拉入Cloud Shell环境,并将目录更改为项目的根目录,以便点 (”。正确解释) 。
如果省略 -t
(与 --image
) 选项相同,该命令会将本地上下文生成排入队列,而不会将其推送到注册表。 在不推送的情况下生成可用于检查映像生成的。
资源组 →本教程“pythoncontainer-rg”中使用的资源组。
服务器名称 →输入在所有 Azure 中唯一的数据库服务器的名称。 数据库服务器的 URL 变为 https://<server-name>.postgres.database.azure.com
。 允许的字符有 A
-Z
、0
-9
和 -
。 例如:postgres-db-unique-id<>。
区域 →用于资源组的同一区域。
管理员用户名→使用 demoadmin。
密码 和 确认密码 →稍后在将容器应用连接到此数据库时要使用的密码。
对于所有其他设置,请保留默认值。 完成后,选择“ 网络 ”转到“网络”页。
连接方法 →选择 “公共访问”。
允许来自任何 Azure 服务的公共访问 → 选中复选框,即允许访问。
添加当前客户端 IP 地址→如果计划从本地服务器访问数据库,请选择 (添加) 。
对于所有其他设置,请保留默认值。 选择“查看 + 创建”以继续。
服务器名称 → 指定服务器 的名称 。
输入在所有 Azure 中唯一的数据库服务器名称, (数据库服务器的 URL 变为 https://<server-name>.postgres.database.azure.com
) 。 允许的字符有 A
-Z
、0
-9
和 -
。 例如:postgres-db-unique-id<>。
选择 Postgres SKU 和选项 →选择 B1 基本 SKU (1 个 vCore、2 GiB 内存、5 GB 存储) 。
管理员用户名 →创建管理员用户名。 数据库服务器上管理员帐户的此名称。 请记录此名称和密码,因为本教程稍后会用到它们。
管理员密码 →为管理员创建密码并确认。
为新资源选择资源组 →选择要放入数据库的用户组。 使用创建App 服务的同一资源组。
选择新资源的位置→选择与资源组和App 服务相同的位置。
步骤 3. 创建数据库后,配置从本地环境到Azure Database for PostgreSQL服务器的访问。
首先,通过检查 “Azure:活动日志 ”窗口确认数据库已创建。 如果确定数据库存在,则:
(F1 或 Ctrl + Shift + P) 打开命令面板。
搜索并选择“ PostgreSQL: 配置防火墙”。 (如果出现提示,请选择订阅。)
选择上面创建的数据库。 如果该数据库名称未显示在列表中,原因可能是该数据库尚未创建完。
在对话框中选择“是”,将你的 IP 地址添加到 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 位置名称值之一。
<admin-username> →管理员帐户的用户名。 它不能是“azure_superuser”、“admin”、“administrator”、“root”、“guest”或“public”。 对于本教程,请使用“demoadmin”。
<admin-password> 管理员用户的密码。 密码必须包含以下三个类别的 8 到 128 个字符:英文大写字母、英文小写字母、数字和非字母数字字符。
创建用户名或密码时 ,请勿 使用“$”字符。 稍后使用这些值创建环境变量,其中“$”字符在用于运行 Python 应用的 Linux 容器中具有特殊含义。
<sku-name>
→定价层和计算配置的名称,例如“Standard_D2s_v3”。 有关详细信息,请参阅 Azure Database for PostgreSQL 定价。 若要列出可用的 SKU,请使用 az postgres flexible-server list-skus --location <location>
。
<public-access>
→使用“0.0.0.0”,它允许从任何 Azure 服务(如容器应用)公开访问服务器。
如果计划使用 Azure CLI 以外的工具从本地工作站使用 PostgreSQL 服务器,则需要使用 az postgres flexible-server firewall-rule create 命令添加防火墙规则。
在服务器上创建数据库
此时,你有一个 PostgreSQL 服务器,现在你将在该服务器上创建一个数据库。
VS Code
Azure CLI
可以在本地环境或 Azure Cloud Shell中使用 PostgreSQL 交互式终端 psql,也可以在Azure 门户中访问。 使用 psql 时,通常更容易使用 Cloud Shell,因为所有依赖项都包含在 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
会退出。
这些步骤需要适用于 VS Code 的 Azure 数据库扩展 。
步骤 1。 在 Azure 扩展中,找到创建的 PostgreSQL 服务器,右键单击它,然后选择“ 创建数据库”。
步骤 2. 在提示符下,输入 restaurants_reviews 作为 数据库名称。
如果在创建数据库时遇到问题,原因可能是服务器仍在处理上一步骤中的防火墙规则。 请稍等片刻,然后重试。 如果系统提示输入用于访问数据库的凭据,请使用用于创建数据库的“demoadmin”用户名和密码。
可以在安装 Azure CLI 的任何位置使用 Azure CLI,包括 Azure Cloud Shell。
步骤 1 使用 az postgres flexible-server db create 命令创建“restaurants_reviews”数据库。
az postgres flexible-server db create \
--resource-group pythoncontainer-rg \
--server-name <postgres-server-name> \
--database-name restaurants_reviews
“pythoncontainer-rg”→本教程中使用的资源组名称。 如果使用了其他名称,请更改此值。
<postgres-server-name>
→ PostgreSQL 服务器的名称。
还可以使用 az postgres flexible-server connect 命令连接到数据库,然后使用 psql 命令。 使用 psql 时,通常更容易使用 Azure Cloud Shell,因为所有依赖项都包含在 shell 中。
还可以连接到 Azure PostgreSQL 灵活服务器,并使用 Azure Data Studio 或任何其他支持 PostgreSQL 的 IDE 创建数据库。
将 Web 应用部署到容器应用
容器应用部署到充当安全边界的容器应用 环境。 在以下步骤中,你将创建环境、环境中的容器,并配置容器,使网站在外部可见。
Azure 门户
VS Code
Azure CLI
容器应用名称 → python-container-app。
区域 → 使用与资源组相同的区域/位置。
容器应用环境 →选择 “新建” 以创建名为 python-container-env 的新环境。
选择“ 下一步: 应用设置” 以继续配置。
HTTP 入口 → 选中 (启用) 复选框。
入口流量 →选择“ 接受来自任意位置的流量”。
目标端口→对于 Django 设置为 8000,对于 Flask 设置为 5000。
选择“ 查看并创建 ”以转到“审阅”页。 查看设置后,选择“ 创建 ”以启动部署。
然后选择 “编辑和部署”。
在 “创建并部署新修订 ”页上,选择容器映像的名称,在本例中为 python-container-app。
在 “编辑容器 ”页上,创建如下所示的环境变量,然后选择“ 保存”。
返回 “创建并部署新修订 ”页,选择“ 创建”。
下面是要创建的以下环境变量:
AZURE_POSTGRESQL_HOST=<postgres-server-name.postgres.database.azure.com>
AZURE_POSTGRESQL_DATABASE=restaurants_reviews
AZURE_POSTGRESQL_USERNAME=demoadmin
AZURE_POSTGRESQL_PASSWORD=<admin-password>
RUNNING_IN_PRODUCTION=1
AZURE_SECRET_KEY=<YOUR-SECRET-KEY>
使用 的python -c 'import secrets; print(secrets.token_hex())'
输出生成AZURE_SECRET_KEY
值。
步骤 1。 创建在创建容器应用期间将引用的 .env 文件。
在示例存储库中,有一个 . env.example 文件,可以从该文件开始。 使用以下值创建 .env 文件:
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
值。
输入新容器应用的名称 →输入 python-container-app。
选择容器注册表 →选择 Azure 容器注册表。
选择Azure 容器注册表→ 选择之前创建的注册表的名称。
选择存储库 →选择 pythoncontainer。
选择标记 →选择 最新。
使用环境变量文件 →选择上面创建的 .env 文件。
为应用程序启用入口 →选择 “启用”。
选择终结点将接受的 HTTP 流量 →选择 “外部”。
将容器侦听 →设置为 8000 (Django) 或 5000 (Flask) 。
若要启动容器任务,还可以转到 Azure 扩展的“容器应用”部分,选择环境,右键单击并选择“ 创建容器应用”。
步骤 5。 仅对于 Django,迁移并创建数据库架构。 (在 Flask 示例应用中,它会自动完成,你可以跳过此步骤。)
转到 Azure 扩展,展开 “容器应用” 部分,找到并展开容器环境,右键单击创建的容器,然后选择“ 在门户中打开控制台”。
选择启动命令,然后选择“ 连接”。
在 shell 提示符下,键入 python manage.py migrate
。
无需迁移容器的修订。
步骤 3. 使用 az containerapp env create 命令创建容器 应用环境。
az containerapp env create \
--name python-container-env \
--resource-group pythoncontainer-rg \
--location <location>
<location> 是命令 az account list-locations -o table
的输出中的 Azure 位置名称值之一。
步骤 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> 是由键=“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
然后,在 shell 命令提示符下键入 python manage.py migrate
。
无需迁移容器的修订。
在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 容器注册表,选择“访问密钥”资源,并确保启用管理员用户。
容器映像不会显示在Azure 容器注册表中。
检查 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 stderr 和 stdout 消息。 Python 的“print”输出将是 stdout 消息。
使用 Azure CLI 时,使用 az containerapp logs show 命令。
如果使用 Django 框架,检查查看数据库中是否存在restaurants_reviews表。 如果没有,请使用控制台访问容器并运行 python manage.py migrate
。
配置持续部署