你当前正在访问 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 表示文件的 IANA mediaType
    有关详细信息,请参阅 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

后续步骤

  • 了解项目引用、关联签名、软件物料清单和其他引用类型
  • 详细了解 ORAS 项目,包括如何为项目配置清单
  • 有关新项目类型的参考信息,请访问 OCI 项目存储库