使用容器和 Azure Functions

本文演示了 Azure Functions 为使用在 Azure 容器应用环境中运行的容器化函数应用而提供的支持。 对容器应用中托管函数应用程序容器的支持当前处于预览阶段。

本文演示 Azure Functions 如何支持用户使用 Linux 容器中运行的函数应用。

在本文的顶部为你的容器化函数应用选择宿主环境。

如果你想要直奔主题,请参阅以下文章,其中介绍了如何创建在 Linux 容器中运行的第一个函数,并将容器注册表中的映像部署到支持的 Azure 宿主服务:

创建第一个容器化 Azure Functions

创建容器化函数应用

借助 Functions,可以轻松地将创建和维护的函数应用作为 Linux 容器进行部署和运行。

重要

创建自己的容器时,需要将容器的基础映像更新为受支持的最新基础映像。 Azure Functions 支持的基映像特定于语言,可在 Azure Functions 基础映像存储库中找到。

Functions 团队致力于发布这些基础映像的每月更新。 定期更新包括 Functions 运行时和语言的最新次要版本更新和安全修补程序。 对于容器,应定期更新 Dockerfile 中的基础映像,重新生成并重新部署容器的更新版本。

有关如何从命令行创建本地容器化函数应用并将映像发布到容器注册表的完整示例,请参阅在本地容器中创建函数应用

生成 Dockerfile

Functions 工具提供了一个 Docker 选项,该选项可使用函数代码项目生成 Dockerfile。 你可以将此文件与 Docker 配合使用,在派生自正确基础映像(语言和版本)的容器中创建函数。

创建 Dockerfile 的方式取决于创建项目的方式。

  • 如果使用 Azure Functions Core Tools 创建 Functions 项目,请在运行 --docker 命令时包括 func init 选项,如以下示例所示:

    func init --docker
    
  • 你还可以将 Dockerfile 添加到现有项目,只需在现有项目文件夹中运行 --docker-only 命令时使用 func init 选项即可,如以下示例所示:

    func init --docker-only
    

有关完整示例,请参阅在本地容器中创建函数应用

在容器中创建函数应用

在代码项目中使用 Core Tools 生成的 Dockerfile,你可以使用 Docker 在本地计算机上创建容器化函数应用。 以下 docker build 命令将从本地目录中的项目创建容器化函数的映像:

docker build --tag <DOCKER_ID>/<IMAGE_NAME>:v1.0.0 .

有关如何创建容器的示例,请参阅生成容器映像并在本地验证

更新注册表中的映像

对函数代码项目进行更改或需要更新到最新的基础映像时,你需要在本地重新生成容器,并将更新后的映像重新发布到所选的容器注册表。 以下命令将使用更新的版本号从根文件夹重新生成映像,并将其推送到注册表:

az acr build --registry <REGISTRY_NAME> --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.1 .

请将 <REGISTRY_NAME> 替换为你的容器注册表实例,并将 <LOGIN_SERVER> 替换为登录服务器名称。

此时,需要更新部署以使用新映像。 以下示例更新函数应用以使用新映像:

az functionapp config container set --image <IMAGE_NAME> --registry-password <SECURE_PASSWORD>--registry-username <USER_NAME> --name <APP_NAME> --resource-group <RESOURCE_GROUP>

在此示例中,<IMAGE_NAME> 是新映像的完整名称(包括版本)。 专用注册表要求提供用户名和密码。 请妥善存储这些凭据。

另外,应考虑启用持续部署

在 Azure Functions 中使用映像

从注册表部署函数应用容器时,Functions 会维护有关源映像的信息。 使用以下命令获取有关映像的数据,或更改使用的部署映像:

应用程序设置

Azure Functions 允许以标准方式使用容器化函数应用的应用程序设置。 有关详细信息,请参阅使用应用程序设置

启用到 Azure 的持续部署

重要

Elastic Premium 计划中运行容器时,目前不支持基于 Webhook 的部署。 如果需要使用本节中所述的持续部署方法,请改为在 应用服务计划中部署容器。 在 Elastic Premium 计划中运行时,每当对存储库中的容器进行更新时,都需要手动重启应用。

可以启用 Azure Functions,以便每次更新注册表中的映像时,都自动更新该映像的部署。

  1. 使用以下命令启用持续部署并获取 Webhook URL:

    az functionapp deployment container config --enable-cd --query CI_CD_URL --output tsv --name <APP_NAME> --resource-group AzureFunctionsContainers-rg
    

    az functionapp deployment container config 命令可启用持续部署并返回部署 Webhook URL。 以后随时可以使用 az functionapp deployment container show-cd-url 命令检索此 URL。

    如前所述,将 <APP_NAME> 替换为函数应用名称。

  2. 将部署 Webhook URL 复制到剪贴板。

  3. 打开 Docker Hub 并登录,然后在导航栏上选择“存储库”。 找到并选择映像,选择“Webhook”选项卡,指定一个 Webhook 名称,将 URL 粘贴到“Webhook URL”中,然后选择“创建”。

    Screenshot showing how to add the webhook in your Docker Hub window.

  4. 设置 Webhook 后,每当在 Docker Hub 中更新映像时,Azure Functions 就会重新部署该映像。

启用 SSH 连接

SSH 实现容器和客户端之间的安全通信。 启用 SSH 后,可以使用应用服务高级工具 (Kudu) 连接到容器。 为了便于使用 SSH 连接到容器,Azure Functions 提供了已启用 SSH 的基础映像。 只需编辑你的 Dockerfile,然后重新生成并重新部署映像即可。 然后,可以通过高级工具 (Kudu) 连接到容器。

  1. 在 Dockerfile 中,将字符串 -appservice 追加到 FROM 指令中的基础映像,如以下示例所示:

    FROM mcr.microsoft.com/azure-functions/node:4-node18-appservice
    

    此示例使用支持 SSH 的 Node.js 版本 18 基础映像。 访问 Azure Functions 基础映像存储库,验证是否使用了支持 SSH 的最新版基础映像。

  2. 使用 docker build 命令重新生成映像(请将命令行中的 <DOCKER_ID> 替换为你的 Docker Hub 帐户 ID),如以下示例所示。

    docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .
    
  3. 将更新的映像推送到 Docker Hub。此过程所需的时间应远远少于首次推送。 现在只需上传更新的映像段。

    docker push <DOCKER_ID>/azurefunctionsimage:v1.0.0
    
  4. Azure Functions 会自动将映像重新部署到 Functions 应用;此过程在一分钟内即可完成。

  5. 在浏览器中打开 https://<app_name>.scm.chinacloudsites.cn/,并将 <app_name> 替换为你的唯一名称。 此 URL 是函数应用容器的高级工具 (Kudu) 终结点。

  6. 登录到你的 Azure 帐户,然后选择“SSH”以便与容器建立连接。 如果 Azure 仍在更新容器映像,则连接可能需要一段时间。

  7. 与容器建立连接后,运行 top 命令查看当前正在运行的进程。

    Screenshot that shows Linux top command running in an SSH session.

后续步骤

以下文章提供了有关部署和管理容器的详细信息: