你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用 Azure 容器注册表推送和拉取 OCI 项目
可以使用 Azure 容器注册表来存储和管理开放容器计划 (OCI) 项目以及 Docker 与 OCI 容器映像。
为了演示此功能,本文介绍了如何使用 OCI 注册表即存储 (ORAS) CLI 将示例项目(一个文本文件)推送到 Azure 容器注册表。 然后从注册表拉取项目。 可以使用适用于每个 OCI 项目的不同命令行工具,在 Azure 容器注册表中管理各种 OCI 项目。
先决条件
- Azure 容器注册表 - 在 Azure 订阅中创建容器注册表。 例如,使用 Azure 门户或 az acr create。
- Azure CLI - 需要版本
2.29.1
或更高版本。 有关安装和/或升级信息,请参阅安装 Azure CLI。 - 需要 ORAS CLI - 版本
v0.16.0
。 请参阅:ORAS 安装。 - Docker(可选)- 虽然不需要 Docker Desktop,但
oras
CLI 会利用 Docker 桌面凭据存储来存储凭据。 如果已安装 Docker Desktop,则它必须是为oras login
运行的。
配置注册表
配置环境变量以轻松地将命令复制/粘贴到 shell 中。 这些命令可以在本地运行或在 Azure Cloud Shell 中运行。
ACR_NAME=myregistry
REGISTRY=$ACR_NAME.azurecr.io
登录到注册表
使用 AD 令牌通过个人 Microsoft Entra 标识进行身份验证。 始终对 USER_NAME
使用“000...”,因为令牌是通过 PASSWORD
变量解析的。
# Login to Azure
az login
# Login to ACR, using a token based on your Azure identity
USER_NAME="00000000-0000-0000-0000-000000000000"
PASSWORD=$(az acr login --name $ACR_NAME --expose-token --output tsv --query accessToken)
注意
ACR 和 ORAS 支持用于用户和系统自动化的多个身份验证选项。 本文通过使用 Azure 令牌使用个人标识。 如需了解更多身份验证选项,请参阅使用 Azure 容器注册表进行身份验证
使用 ORAS 登录
向 oras login
提供凭据。
oras login $REGISTRY \
--username $USER_NAME \
--password $PASSWORD
推送根项目
根项目是没有 subject
父项的项目。 根项目可以是容器映像、helm chart、存储库的自述文件中的任何内容。 在附加、推送和拉取供应链项目中描述的引用项目是引用另一个项目的项目。 引用项目可以是签名、软件物料清单、扫描报告或其他不断演变的类型中的任何东西。
对于此示例,请创建表示 Markdown 文件的内容:
echo 'Readme Content' > readme.md
以下步骤将 readme.md
文件推送到 <myregistry>.azurecr.io/samples/artifact:readme
。
- 注册表使用完全限定的注册表名称
<myregistry>.azurecr.io
(全部小写)进行标识,后跟名称空间和存储库:/samples/artifact
。 - 该项目被标记为
:readme
,以区别于存储库 (:latest, :v1, :v1.0.1
) 中列出的其他项目。 - 设置
--artifact-type readme/example
将项目与使用application/vnd.oci.image.config.v1+json
的容器映像区分开来。 ./readme.md
标识上传的文件,:application/markdown
表示文件的 IANAmediaType
。
有关详细信息,请参阅 OCI 项目创建者指南。
使用 oras push
命令将文件推送到注册表。
Linux、WSL2 或 macOS
oras push $REGISTRY/samples/artifact:readme \
--artifact-type readme/example \
./readme.md:application/markdown
Windows
.\oras.exe push $REGISTRY/samples/artifact:readme ^
--artifact-type readme/example ^
.\readme.md:application/markdown
成功推送后,输出将如下所示:
Uploading 2fdeac43552b readme.md
Uploaded 2fdeac43552b readme.md
Pushed <myregistry>.azurecr.io/samples/artifact:readme
Digest: sha256:e2d60d1b171f08bd10e2ed171d56092e39c7bac1aec5d9dcf7748dd702682d53
推送多文件根项目
使用 ORAS 将 OCI 项目推送到注册表时,每个文件引用会作为一个 Blob 推送。 若要推送单独的 Blob,请单独引用文件,或通过引用目录来引用文件集合。
若要详细了解如何推送文件集合,请参阅推送包含多个文件的项目
为存储库创建一些文档:
echo 'Readme Content' > readme.md
mkdir details/
echo 'Detailed Content' > details/readme-details.md
echo 'More detailed Content' > details/readme-more-details.md
推送多文件项目:
Linux、WSL2 或 macOS
oras push $REGISTRY/samples/artifact:readme \
--artifact-type readme/example\
./readme.md:application/markdown\
./details
Windows
.\oras.exe push $REGISTRY/samples/artifact:readme ^
--artifact-type readme/example ^
.\readme.md:application/markdown ^
.\details
发现清单
若要查看作为 oras push
的结果创建的清单,请使用 oras manifest fetch
:
oras manifest fetch --pretty $REGISTRY/samples/artifact:readme
输出结果会类似于:
{
"mediaType": "application/vnd.oci.artifact.manifest.v1+json",
"artifactType": "readme/example",
"blobs": [
{
"mediaType": "application/markdown",
"digest": "sha256:2fdeac43552b71eb9db534137714c7bad86b53a93c56ca96d4850c9b41b777fc",
"size": 15,
"annotations": {
"org.opencontainers.image.title": "readme.md"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:0d6c7434a34f6854f971487621426332e6c0fda08040b9e6cc8a93f354cee0b1",
"size": 189,
"annotations": {
"io.deis.oras.content.digest": "sha256:11eceb2e7ac3183ec9109003a7389468ec73ad5ceaec0c4edad0c1b664c5593a",
"io.deis.oras.content.unpack": "true",
"org.opencontainers.image.title": "details"
}
}
],
"annotations": {
"org.opencontainers.artifact.created": "2023-01-10T14:44:06Z"
}
}
拉取根项目
为下载创建一个干净的目录
mkdir ./download
请运行 oras pull
命令从注册表拉取项目。
oras pull -o ./download $REGISTRY/samples/artifact:readme
查看拉取的文件
tree ./download
删除项目(可选)
若要从注册表中删除项目,请使用 oras manifest delete
命令。
oras manifest delete $REGISTRY/samples/artifact:readme