设置应用程序管理的容器和服务¶
本主题介绍如何为 Snowflake Native App with Snowpark Container Services 设置容器和服务。
创建镜像仓库¶
要使用 Snowflake Native App 管理容器,提供商必须在提供商账户中创建一个 镜像仓库,以存储应用程序所需的镜像。
镜像仓库必须存在于数据库和架构中。下面的示例显示了如何使用 CREATE IMAGE REPOSITORY 命令创建镜像仓库。
CREATE DATABASE provider_db;
CREATE SCHEMA provider_schema;
CREATE IMAGE REPOSITORY provider_repo;
备注
Snowflake 建议提供商在应用程序包之外创建镜像仓库。
如果应用程序包附于列表,且列表配置为使用 Cross-Cloud Auto-Fulfillment,则应用程序包内的镜像仓库将被复制,并产生额外费用。
在添加版本定义时,应用程序包可以访问上传到该仓库的镜像。应用程序只能访问该仓库中在应用程序包的清单文件中指定的镜像。
以下考虑因素适用于使用容器的应用程序中的镜像仓库:
不支持外部镜像仓库。容器内的任何服务都无法引用 Snowflake 外部的镜像仓库。这适用于应用程序内外的服务。
提供商不能直接与应用程序共享镜像仓库。例如,提供商不能使用 GRANT TO SHARE IN APPLICATION PACKAGE 命令。
提供商可以在一个镜像仓库中存储多个容器镜像。不过,使用者账户中的应用程序无法访问清单中未明确列出的容器镜像。
当提供商将版本定义添加到应用程序包时,该版本中包含的容器镜像不能修改。该版本的镜像是不可变的,并在版本的整个生命周期中持续存在。要更改应用程序中的容器,提供商必须使用新版本。
将容器镜像上传到镜像仓库¶
创建镜像仓库后,提供商使用 Docker 命令将应用程序所需的容器镜像上传到镜像仓库。所需的具体命令取决于提供商的环境。不过,一般工作流程为:
docker 登录
docker 构建
docker 标签
docker 推送
下面是如何使用这些命令的典型示例:
$ docker login org-provider-account.registry.snowflakecomputing.cn
$ docker build --rm --platform linux/amd64 -t service:1.0 .
$ docker tag service:1.0 org-provider-account.registry.snowflakecomputing.cn/provider_db/provider_schema/provider_repo/service:1.0
$ docker push org-provider-account.registry.snowflakecomputing.cnprovider_db/provider_schema/provider_repo/service:1.0
创建服务规范文件¶
服务规范是 YAML 文件,Snowpark Container Services 使用该文件来配置和运行服务。有关该文件语法的一般信息,请参阅 服务规范参考。有关在安装脚本中创建服务的示例,请参阅 使用规范文件创建服务。
下面的示例显示了使用容器的应用程序所需的服务规范文件中的字段。
spec:
containers:
- image: /provider_db/provider_schema/provider_repo/server:prod
name: server
...
- image: /provider_db/provider_schema/provider_repo/web:1.0
name: web
...
endpoints:
- name: invoke
port: 8000
- name: ui
port: 5000
public: true
备注
服务规范文件使用原始数据库、架构和镜像仓库名称引用容器镜像。在安装或升级过程中,会根据服务规范文件创建一个服务。
不支持显式注册表 URLs,例如 org-provider.registry.snowflakecomputing.cn/db/schema/repo/img:123
,并会导致错误。镜像的位置必须始终是提供商账户中的完全限定名称。
使用规范模板¶
提供商还可以通过在服务规范文件中添加对模板的引用,使用 规范模板:
spec:
containers:
- image: /provider_db/provider_schema/provider_repo/server:prod
name: my_app_container
endpoints:
- name: invoke
port: 8000
- name: ui
port: 5000
public: true
有关使用规范模板在应用程序中创建服务的示例,请参阅 使用规范模板创建服务。