Démarrage rapide : Utiliser les bibliothèques de client Azure Container Registry
Lisez cet article afin de bien démarrer avec la bibliothèque de client pour Azure Container Registry. Effectuez ces étapes pour tester un exemple de code pour des opérations de plan de données sur des images et des artefacts.
Utilisez la bibliothèques de client pour Azure Container Registry afin de :
- Lister des images ou des artefacts dans un registre.
- Obtenir des métadonnées pour des images et artefacts, des dépôts et des étiquettes.
- Définir les propriétés de lecture/écriture/suppression sur des éléments du registre.
- Supprimer des images et artefacts, des référentiels et des étiquettes.
Azure Container Registry a également une bibliothèque de gestion pour les opérations de plan de contrôle, notamment la création et les mises à jour du registre.
Prérequis
Pour utiliser cette bibliothèque, vous avez besoin d’un abonnement Azure et d’un registre de conteneurs Azure.
Pour créer un registre de conteneurs Azure, vous pouvez utiliser le portail Azure, Azure PowerShell ou Azure CLI. Voici un exemple utilisant Azure CLI :
az acr create --name MyContainerRegistry --resource-group MyResourceGroup \ --location westus --sku Basic
Transmettre une ou plusieurs images conteneur à votre registre. Pour connaître les étapes, consultez Transmettre votre première image à votre registre de conteneurs Azure à l’aide de l’interface de ligne de commande Docker.
Concepts clés
- Un registre de conteneurs Azure stocke des images conteneur et des artefacts OCI.
- Une image ou un artefact se compose d’un manifeste et de couches.
- Un manifeste décrit les couches qui composent l’image ou l’artefact. Il est identifié de manière unique par son code de hachage.
- Une image ou un artefact peut également être étiqueté pour lui attribuer un alias explicite. Une image ou un artefact peut être associé à zéro, une ou plusieurs étiquettes, et chaque étiquette identifie l’image de manière unique.
- Une collection d’images ou d’artefacts ayant le même nom mais des étiquettes différentes est un référentiel.
Pour plus d’informations, consultez À propos des registres, des dépôts et des artefacts.
Bien démarrer
Code source | Package (NuGet) | Référence d’API | Exemples
Pour développer du code d’application .NET capable de se connecter à une instance d’Azure Container Registry, vous aurez besoin de la bibliothèque Azure.Containers.ContainerRegistry
.
Installer le package
Installez la bibliothèque de client Azure Container Registry pour .NET avec NuGet :
dotnet add package Azure.Containers.ContainerRegistry --prerelease
Authentifier le client
Pour que votre application se connecte à votre registre, vous devez créer un ContainerRegistryClient
qui peut s’authentifier auprès de celui-ci. Utilisez la bibliothèque Azure Identity afin d’ajouter la prise en charge Microsoft Entra ID pour l’authentification des clients du SDK Azure auprès de leurs services Azure correspondants.
Lorsque vous développez et déboguez votre application localement, vous pouvez utiliser votre propre utilisateur pour vous authentifier auprès de votre registre. L’une des manières d’y parvenir consiste à authentifier votre utilisateur auprès d’Azure CLI et à exécuter votre application à partir de cet environnement. Si votre application utilise un client qui a été construit pour s’authentifier avec DefaultAzureCredential
, il s’authentifiera correctement auprès du registre au point de terminaison spécifié.
// Create a ContainerRegistryClient that will authenticate to your registry through Azure Active Directory
Uri endpoint = new Uri("https://myregistry.azurecr.io");
ContainerRegistryClient client = new ContainerRegistryClient(endpoint, new DefaultAzureCredential(),
new ContainerRegistryClientOptions()
{
Audience = ContainerRegistryAudience.AzureResourceManagerPublicCloud
});
Pour découvrir d’autres approches sur l’authentification avec , à la fois localement et dans les environnements de déploiement, consultez le fichier Lisez-moi Azure IdentityDefaultAzureCredential
. Pour vous connecter à des registres dans des clouds Azure non publics, consultez les informations de référence sur l’API.
Pour plus d’informations sur l’utilisation de Microsoft Entra ID avec Azure Container Registry, consultez la vue d’ensemble de l’authentification.
Exemples
Chaque exemple part du principe qu’il existe une variable d’environnement REGISTRY_ENDPOINT
ayant comme valeur une chaîne contenant le préfixe https://
et le nom du serveur de connexion, par exemple « https://myregistry.azurecr.io" ».
Les exemples suivants utilisent des API asynchrones qui retournent une tâche. Des API synchrones sont également disponibles.
Lister les référentiels de manière asynchrone
Itérez au sein de la collection de référentiels dans le registre.
// Get the service endpoint from the environment
Uri endpoint = new Uri(Environment.GetEnvironmentVariable("REGISTRY_ENDPOINT"));
// Create a new ContainerRegistryClient
ContainerRegistryClient client = new ContainerRegistryClient(endpoint, new DefaultAzureCredential(),
new ContainerRegistryClientOptions()
{
Audience = ContainerRegistryAudience.AzureResourceManagerPublicCloud
});
// Get the collection of repository names from the registry
AsyncPageable<string> repositories = client.GetRepositoryNamesAsync();
await foreach (string repository in repositories)
{
Console.WriteLine(repository);
}
Définir des propriétés d’artefacts de manière asynchrone
// Get the service endpoint from the environment
Uri endpoint = new Uri(Environment.GetEnvironmentVariable("REGISTRY_ENDPOINT"));
// Create a new ContainerRegistryClient
ContainerRegistryClient client = new ContainerRegistryClient(endpoint, new DefaultAzureCredential(),
new ContainerRegistryClientOptions()
{
Audience = ContainerRegistryAudience.AzureResourceManagerPublicCloud
});
// Get the collection of repository names from the registry
AsyncPageable<string> repositories = client.GetRepositoryNamesAsync();
await foreach (string repository in repositories)
{
Console.WriteLine(repository);
}
Supprimer des images de manière asynchrone
using System.Linq;
using Azure.Containers.ContainerRegistry;
using Azure.Identity;
// Get the service endpoint from the environment
Uri endpoint = new Uri(Environment.GetEnvironmentVariable("REGISTRY_ENDPOINT"));
// Create a new ContainerRegistryClient
ContainerRegistryClient client = new ContainerRegistryClient(endpoint, new DefaultAzureCredential(),
new ContainerRegistryClientOptions()
{
Audience = ContainerRegistryAudience.AzureResourceManagerPublicCloud
});
// Iterate through repositories
AsyncPageable<string> repositoryNames = client.GetRepositoryNamesAsync();
await foreach (string repositoryName in repositoryNames)
{
ContainerRepository repository = client.GetRepository(repositoryName);
// Obtain the images ordered from newest to oldest
AsyncPageable<ArtifactManifestProperties> imageManifests =
repository.GetManifestPropertiesCollectionAsync(orderBy: ArtifactManifestOrderBy.LastUpdatedOnDescending);
// Delete images older than the first three.
await foreach (ArtifactManifestProperties imageManifest in imageManifests.Skip(3))
{
RegistryArtifact image = repository.GetArtifact(imageManifest.Digest);
Console.WriteLine($"Deleting image with digest {imageManifest.Digest}.");
Console.WriteLine($" Deleting the following tags from the image: ");
foreach (var tagName in imageManifest.Tags)
{
Console.WriteLine($" {imageManifest.RepositoryName}:{tagName}");
await image.DeleteTagAsync(tagName);
}
await image.DeleteAsync();
}
}
Bien démarrer
Code source | Package (Maven) | Référence d’API | Exemples
Environnements actuellement pris en charge
- Kit de développement Java (JDK), version 8 ou ultérieure.
Inclure le package
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-containers-containerregistry</artifactId>
<version>1.0.0-beta.3</version>
</dependency>
Authentifier le client
La bibliothèque Azure Identity fournit la prise en charge de Microsoft Entra ID pour l’authentification.
Les exemples suivants partent du principe que vous avez une chaîne de point de terminaison de registre contenant le préfixe https://
et le nom du serveur de connexion, par exemple « https://myregistry.azurecr.io" ».
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder().build();
ContainerRegistryClient client = new ContainerRegistryClientBuilder()
.endpoint(endpoint)
.credential(credential)
.buildClient();
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder().build();
ContainerRegistryAsyncClient client = new ContainerRegistryClientBuilder()
.endpoint(endpoint)
.credential(credential)
.buildAsyncClient();
Pour plus d’informations sur l’utilisation de Microsoft Entra ID avec Azure Container Registry, consultez la vue d’ensemble de l’authentification.
Exemples
Chaque exemple part du principe qu’il existe une chaîne de point de terminaison de registre contenant le préfixe https://
et le nom du serveur de connexion, par exemple « https://myregistry.azurecr.io" ».
Lister les noms des référentiels
Itérez au sein de la collection de référentiels dans le registre.
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder().build();
ContainerRegistryClient client = new ContainerRegistryClientBuilder()
.endpoint(endpoint)
.credential(credential)
.buildClient();
client.listRepositoryNames().forEach(repository -> System.out.println(repository));
Définir les propriétés des artefacts
TokenCredential defaultCredential = new DefaultAzureCredentialBuilder().build();
ContainerRegistryClient client = new ContainerRegistryClientBuilder()
.endpoint(endpoint)
.credential(defaultCredential)
.buildClient();
RegistryArtifact image = client.getArtifact(repositoryName, digest);
image.updateTagProperties(
tag,
new ArtifactTagProperties()
.setWriteEnabled(false)
.setDeleteEnabled(false));
Supprimer des images
TokenCredential defaultCredential = new DefaultAzureCredentialBuilder().build();
ContainerRegistryClient client = new ContainerRegistryClientBuilder()
.endpoint(endpoint)
.credential(defaultCredential)
.buildClient();
final int imagesCountToKeep = 3;
for (String repositoryName : client.listRepositoryNames()) {
final ContainerRepository repository = client.getRepository(repositoryName);
// Obtain the images ordered from newest to oldest
PagedIterable<ArtifactManifestProperties> imageManifests =
repository.listManifestProperties(
ArtifactManifestOrderBy.LAST_UPDATED_ON_DESCENDING,
Context.NONE);
imageManifests.stream().skip(imagesCountToKeep)
.forEach(imageManifest -> {
System.out.printf(String.format("Deleting image with digest %s.%n", imageManifest.getDigest()));
System.out.printf(" This image has the following tags: ");
for (String tagName : imageManifest.getTags()) {
System.out.printf(" %s:%s", imageManifest.getRepositoryName(), tagName);
}
repository.getArtifact(imageManifest.getDigest()).delete();
});
}
Bien démarrer
Code source | Package (npm) | Référence d’API | Exemples
Environnements actuellement pris en charge
Pour plus d’informations, consultez notre politique de support .
Installez le package @azure/container-registry
Installez la bibliothèque de client Container Registry pour JavaScript avec npm
:
npm install @azure/container-registry
Authentifier le client
La bibliothèque Azure Identity fournit la prise en charge de Microsoft Entra ID pour l’authentification.
const { ContainerRegistryClient } = require("@azure/container-registry");
const { DefaultAzureCredential } = require("@azure/identity");
const endpoint = process.env.CONTAINER_REGISTRY_ENDPOINT;
// Create a ContainerRegistryClient that will authenticate through Active Directory
const client = new ContainerRegistryClient(endpoint, new DefaultAzureCredential());
Pour plus d’informations sur l’utilisation de Microsoft Entra ID avec Azure Container Registry, consultez la vue d’ensemble de l’authentification.
Exemples
Chaque exemple part du principe qu’il existe une variable d’environnement CONTAINER_REGISTRY_ENDPOINT
ayant comme valeur une chaîne contenant le préfixe https://
et le nom du serveur de connexion, par exemple « https://myregistry.azurecr.io" ».
Lister les référentiels de manière asynchrone
Itérez au sein de la collection de référentiels dans le registre.
const { ContainerRegistryClient } = require("@azure/container-registry");
const { DefaultAzureCredential } = require("@azure/identity");
async function main() {
// endpoint should be in the form of "https://myregistryname.azurecr.io"
// where "myregistryname" is the actual name of your registry
const endpoint = process.env.CONTAINER_REGISTRY_ENDPOINT || "<endpoint>";
const client = new ContainerRegistryClient(endpoint, new DefaultAzureCredential());
console.log("Listing repositories");
const iterator = client.listRepositoryNames();
for await (const repository of iterator) {
console.log(` repository: ${repository}`);
}
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
Définir des propriétés d’artefacts de manière asynchrone
const { ContainerRegistryClient } = require("@azure/container-registry");
const { DefaultAzureCredential } = require("@azure/identity");
async function main() {
// Get the service endpoint from the environment
const endpoint = process.env.CONTAINER_REGISTRY_ENDPOINT || "<endpoint>";
// Create a new ContainerRegistryClient and RegistryArtifact to access image operations
const client = new ContainerRegistryClient(endpoint, new DefaultAzureCredential());
const image = client.getArtifact("library/hello-world", "v1");
// Set permissions on the image's "latest" tag
await image.updateTagProperties("latest", { canWrite: false, canDelete: false });
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
Supprimer des images de manière asynchrone
const { ContainerRegistryClient } = require("@azure/container-registry");
const { DefaultAzureCredential } = require("@azure/identity");
async function main() {
// Get the service endpoint from the environment
const endpoint = process.env.CONTAINER_REGISTRY_ENDPOINT || "<endpoint>";
// Create a new ContainerRegistryClient
const client = new ContainerRegistryClient(endpoint, new DefaultAzureCredential());
// Iterate through repositories
const repositoryNames = client.listRepositoryNames();
for await (const repositoryName of repositoryNames) {
const repository = client.getRepository(repositoryName);
// Obtain the images ordered from newest to oldest by passing the `orderBy` option
const imageManifests = repository.listManifestProperties({
orderBy: "LastUpdatedOnDescending"
});
const imagesToKeep = 3;
let imageCount = 0;
// Delete images older than the first three.
for await (const manifest of imageManifests) {
imageCount++;
if (imageCount > imagesToKeep) {
const image = repository.getArtifact(manifest.digest);
console.log(`Deleting image with digest ${manifest.digest}`);
console.log(` Deleting the following tags from the image:`);
for (const tagName of manifest.tags) {
console.log(` ${manifest.repositoryName}:${tagName}`);
image.deleteTag(tagName);
}
await image.delete();
}
}
}
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
Bien démarrer
Code source | Package (Pypi) | Référence d’API | Exemples
Installer le package
Installez la bibliothèque de client Azure Container Registry pour Python avec pip :
pip install --pre azure-containerregistry
Authentifier le client
La bibliothèque Azure Identity fournit la prise en charge de Microsoft Entra ID pour l’authentification. DefaultAzureCredential
part du principe que les variables d’environnement AZURE_CLIENT_ID
, AZURE_TENANT_ID
et AZURE_CLIENT_SECRET
sont définies. Pour en savoir plus, consultez Variables d’environnement Azure Identity.
# Create a ContainerRegistryClient that will authenticate through Active Directory
from azure.containerregistry import ContainerRegistryClient
from azure.identity import DefaultAzureCredential
account_url = "https://mycontainerregistry.azurecr.io"
client = ContainerRegistryClient(account_url, DefaultAzureCredential())
Exemples
Chaque exemple part du principe qu’il existe une variable d’environnement CONTAINERREGISTRY_ENDPOINT
ayant comme valeur une chaîne contenant le préfixe https://
et le nom du serveur de connexion, par exemple « https://myregistry.azurecr.io" ».
Lister les étiquettes de façon asynchrone
Cet exemple part du principe que le registre a un référentiel hello-world
.
import asyncio
from dotenv import find_dotenv, load_dotenv
import os
from azure.containerregistry.aio import ContainerRegistryClient
from azure.identity.aio import DefaultAzureCredential
class ListTagsAsync(object):
def __init__(self):
load_dotenv(find_dotenv())
async def list_tags(self):
# Create a new ContainerRegistryClient
audience = "https://management.azure.com"
account_url = os.environ["CONTAINERREGISTRY_ENDPOINT"]
credential = DefaultAzureCredential()
client = ContainerRegistryClient(account_url, credential, audience=audience)
manifest = await client.get_manifest_properties("library/hello-world", "latest")
print(manifest.repository_name + ": ")
for tag in manifest.tags:
print(tag + "\n")
Définir des propriétés d’artefacts de manière asynchrone
Cet exemple part du principe que le registre a un référentiel hello-world
avec une image étiquetée v1
.
import asyncio
from dotenv import find_dotenv, load_dotenv
import os
from azure.containerregistry.aio import ContainerRegistryClient
from azure.identity.aio import DefaultAzureCredential
class SetImagePropertiesAsync(object):
def __init__(self):
load_dotenv(find_dotenv())
async def set_image_properties(self):
# Create a new ContainerRegistryClient
account_url = os.environ["CONTAINERREGISTRY_ENDPOINT"]
audience = "https://management.azure.com"
credential = DefaultAzureCredential()
client = ContainerRegistryClient(account_url, credential, audience=audience)
# [START update_manifest_properties]
# Set permissions on the v1 image's "latest" tag
await client.update_manifest_properties(
"library/hello-world",
"latest",
can_write=False,
can_delete=False
)
# [END update_manifest_properties]
# After this update, if someone were to push an update to "myacr.azurecr.io\hello-world:v1", it would fail.
# It's worth noting that if this image also had another tag, such as "latest", and that tag did not have
# permissions set to prevent reads or deletes, the image could still be overwritten. For example,
# if someone were to push an update to "myacr.azurecr.io\hello-world:latest"
# (which references the same image), it would succeed.
Supprimer des images de manière asynchrone
import asyncio
from dotenv import find_dotenv, load_dotenv
import os
from azure.containerregistry import ManifestOrder
from azure.containerregistry.aio import ContainerRegistryClient
from azure.identity.aio import DefaultAzureCredential
class DeleteImagesAsync(object):
def __init__(self):
load_dotenv(find_dotenv())
async def delete_images(self):
# [START list_repository_names]
audience = "https://management.azure.com"
account_url = os.environ["CONTAINERREGISTRY_ENDPOINT"]
credential = DefaultAzureCredential()
client = ContainerRegistryClient(account_url, credential, audience=audience)
async with client:
async for repository in client.list_repository_names():
print(repository)
# [END list_repository_names]
# [START list_manifest_properties]
# Keep the three most recent images, delete everything else
manifest_count = 0
async for manifest in client.list_manifest_properties(repository, order_by=ManifestOrder.LAST_UPDATE_TIME_DESCENDING):
manifest_count += 1
if manifest_count > 3:
await client.delete_manifest(repository, manifest.digest)
# [END list_manifest_properties]
Bien démarrer
Code source | Package (pkg.go.dev) | Informations de référence sur l’API REST
Installer le package
Installez la bibliothèque de client Azure Container Registry pour Go avec go get
:
go get github.com/Azure/azure-sdk-for-go/sdk/containers/azcontainerregistry
Authentifier le client
Lorsque vous développez et déboguez votre application localement, vous pouvez utiliser azidentity.NewDefaultAzureCredential pour vous authentifier. Nous vous recommandons d’utiliser une identité managée dans un environnement de production.
import (
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/containers/azcontainerregistry"
"log"
)
func main() {
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
log.Fatalf("failed to obtain a credential: %v", err)
}
client, err := azcontainerregistry.NewClient("https://myregistry.azurecr.io", cred, nil)
if err != nil {
log.Fatalf("failed to create client: %v", err)
}
}
Pour obtenir plus d’informations sur les autres approches d’authentification, consultez la documentation azidentity.
Exemples
Chaque exemple suppose que l’URL du point de terminaison du registre de conteneurs est « https://myregistry.azurecr.io" ».
Répertorier les balises
Cet exemple part du principe que le registre a un référentiel hello-world
.
import (
"context"
"fmt"
"github.com/Azure/azure-sdk-for-go/sdk/containers/azcontainerregistry"
"log"
)
func Example_listTagsWithAnonymousAccess() {
client, err := azcontainerregistry.NewClient("https://myregistry.azurecr.io", nil, nil)
if err != nil {
log.Fatalf("failed to create client: %v", err)
}
ctx := context.Background()
pager := client.NewListTagsPager("library/hello-world", nil)
for pager.More() {
page, err := pager.NextPage(ctx)
if err != nil {
log.Fatalf("failed to advance page: %v", err)
}
for _, v := range page.Tags {
fmt.Printf("tag: %s\n", *v.Name)
}
}
}
Définir les propriétés des artefacts
Cet exemple part du principe que le registre a un référentiel hello-world
avec une image étiquetée latest
.
package azcontainerregistry_test
import (
"context"
"fmt"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/containers/azcontainerregistry"
"log"
)
func Example_setArtifactProperties() {
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
log.Fatalf("failed to obtain a credential: %v", err)
}
client, err := azcontainerregistry.NewClient("https://myregistry.azurecr.io", cred, nil)
if err != nil {
log.Fatalf("failed to create client: %v", err)
}
ctx := context.Background()
res, err := client.UpdateTagProperties(ctx, "library/hello-world", "latest", &azcontainerregistry.ClientUpdateTagPropertiesOptions{
Value: &azcontainerregistry.TagWriteableProperties{
CanWrite: to.Ptr(false),
CanDelete: to.Ptr(false),
}})
if err != nil {
log.Fatalf("failed to finish the request: %v", err)
}
fmt.Printf("repository library/hello-world - tag latest: 'CanWrite' property: %t, 'CanDelete' property: %t\n", *res.Tag.ChangeableAttributes.CanWrite, *res.Tag.ChangeableAttributes.CanDelete)
}
Supprimer des images
package azcontainerregistry_test
import (
"context"
"fmt"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/containers/azcontainerregistry"
"log"
)
func Example_deleteImages() {
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
log.Fatalf("failed to obtain a credential: %v", err)
}
client, err := azcontainerregistry.NewClient("https://myregistry.azurecr.io", cred, nil)
if err != nil {
log.Fatalf("failed to create client: %v", err)
}
ctx := context.Background()
repositoryPager := client.NewListRepositoriesPager(nil)
for repositoryPager.More() {
repositoryPage, err := repositoryPager.NextPage(ctx)
if err != nil {
log.Fatalf("failed to advance repository page: %v", err)
}
for _, r := range repositoryPage.Repositories.Names {
manifestPager := client.NewListManifestsPager(*r, &azcontainerregistry.ClientListManifestsOptions{
OrderBy: to.Ptr(azcontainerregistry.ArtifactManifestOrderByLastUpdatedOnDescending),
})
for manifestPager.More() {
manifestPage, err := manifestPager.NextPage(ctx)
if err != nil {
log.Fatalf("failed to advance manifest page: %v", err)
}
imagesToKeep := 3
for i, m := range manifestPage.Manifests.Attributes {
if i >= imagesToKeep {
for _, t := range m.Tags {
fmt.Printf("delete tag from image: %s", *t)
_, err := client.DeleteTag(ctx, *r, *t, nil)
if err != nil {
log.Fatalf("failed to delete tag: %v", err)
}
}
_, err := client.DeleteManifest(ctx, *r, *m.Digest, nil)
if err != nil {
log.Fatalf("failed to delete manifest: %v", err)
}
fmt.Printf("delete image with digest: %s", *m.Digest)
}
}
}
}
}
}
Nettoyer les ressources
Si vous voulez nettoyer et supprimer un registre de conteneurs Azure, vous pouvez supprimer la ressource ou le groupe de ressources. La suppression du groupe de ressources efface également les autres ressources qui y sont associées.
Étapes suivantes
Dans ce guide de démarrage rapide, vous avez appris à utiliser la bibliothèque de client Azure Container Registry pour effectuer des opérations sur des images et des artefacts dans votre registre de conteneurs.
Pour plus d’informations, consultez la documentation de référence sur l’API.
Apprenez-en davantage sur l’API REST Azure Container Registry.