如何将 Python 脚本部署到 Azure Container Apps Job

用最小示例演示:将 Python 脚本容器化,推送到 ACR,并以 Azure Container Apps Job 方式定时或按需运行。

前言

最近在项目里需要把一个 Python 脚本放到 Azure Container Apps (ACA) 的 Job 中定时/按需运行,整理了一套最小示例,方便之后复用。

前提条件

  • 已创建 Azure Container Registry (ACR),并确认所在的 resource group、位置。
  • 已安装 Docker 与 Azure CLI,且可登录对应 Azure 订阅(具备推送镜像、创建 ACA Job 的权限)。
  • 已准备好要运行的 Azure resource group(示例命令里用 RESOURCE_GROUP 占位)。

步骤

1. 准备程序

示例脚本会读取环境变量并打印日志,适合作为健康检查或批处理任务的模板。

main.py

import logging
import os
import time

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(message)s",
)


def main():
    job_name = os.getenv("JOB_NAME", "demo-job")
    sleep_seconds = int(os.getenv("SLEEP_SECONDS", "5"))

    logging.info("Job %s started", job_name)
    for i in range(sleep_seconds):
        logging.info("Running step %s/%s", i + 1, sleep_seconds)
        time.sleep(1)
    logging.info("Job %s completed", job_name)


if __name__ == "__main__":
    main()

Dockerfile

FROM python:3.11-slim

WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1

COPY main.py .

CMD ["python", "main.py"]

2. 本地环境准备

示例基于 Ubuntu。如果已安装 Docker 与 Azure CLI,可跳过本节。

安装Docker

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

为避免每次运行 Docker 都需要 sudo,可以查看 这篇 文章。

安装Azure CLI

curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

登录Azure

az login

3. 编译镜像并推送到ACR

需要替换的占位符:

ACR_NAME -> Registry 的名字(不含 .azurecr.io)
IMAGE_NAME:VERSION -> 镜像的名字和版本,比如 myapp:latest
ACR_USERNAME -> ACR 管理员账号
ACR_PASSWORD -> ACR 管理员密码

提前登录 Registry(如果已经登录 Azure CLI 会自动通过):

az acr login --name ACR_NAME

如果未登录 Azure CLI,也可以开启 ACR 管理员账户,通过 docker login 登录:

docker login ACR_NAME.azurecr.io -u ACR_USERNAME -p ACR_PASSWORD

账号和密码可以在 ACR 的「访问密钥」页面查看(如下图所示)。 图

构建并推送镜像到 ACR:

docker build --platform linux/amd64 -t ACR_NAME.azurecr.io/IMAGE_NAME:VERSION .
docker push ACR_NAME.azurecr.io/IMAGE_NAME:VERSION

4. 创建 ACA Job

每个 Job 需要绑定到一个 ACA Environment,以便复用虚拟网络等配置。先创建环境(如已有可跳过):

az containerapp env create \
  --name ENVIRONMENT_NAME \
  --resource-group RESOURCE_GROUP \
  --location japaneast

然后创建 Job:

az containerapp job create \
  --name JOB_NAME \
  --resource-group RESOURCE_GROUP \
  --environment ENVIRONMENT_NAME \
  --image ACR_NAME.azurecr.io/IMAGE_NAME:VERSION \
  --cpu 1.0 \
  --memory 2Gi \
  --replica-timeout 1800 \
  --replica-retry-limit 2 \
  --parallelism 1 \
  --replica-completion-count 1 \
  --trigger-type Manual \
  --env-vars \
    JOB_NAME=JOB_NAME \
    SLEEP_SECONDS=5 \
  --registry-server ACR_NAME.azurecr.io \
  --registry-username ACR_USERNAME \
  --registry-password ACR_PASSWORD

镜像拉取的认证方式有两种:

  • 使用 ACR 管理员账号密码(如上命令所示)。
  • 使用托管标识(ACR 未开启管理员账号时)。替换上面命令中的认证参数为:
  --registry-identity system \
  --mi-system-assigned

下图可以看到当前使用的认证方式。 图

5. 执行 Job

可以在 Azure 门户点击「Run now」,也可以用 CLI:

az containerapp job start -n JOB_NAME -g RESOURCE_GROUP

图

执行详情可在「Execution history」中查看日志与退出状态。 图

结论

按照上述步骤即可将 Python 脚本封装成镜像、推送到 ACR,并通过 Azure Container Apps Job 灵活运行。你可以进一步在 Job 中调整 CPU/内存、并发度,以及改为 Schedule 触发类型以满足定时任务场景。