Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Azure Container Registry ti permette di memorizzare e gestire immagini e artefatti di container in un registro privato per tutti i tipi di deployment container.
Usa la biblioteca client per Azure Container Registry per:
- Elencare immagini o artefatti in un registro
- Ottenere metadati per immagini e artefatti, repository e tag
- Impostare le proprietà di lettura/scrittura/eliminazione per gli elementi del registro
- Elimina immagini e artefatti, depositi e tag
Collegamenti chiave:
- Codice sorgente
- Pacchetto (NPM)
- documentazione di riferimento dell'API
- Documentazione relativa all'API REST
- Documentazione del prodotto
- Campioni
Come iniziare
Ambienti attualmente supportati
Consulta la nostra politica support per maggiori dettagli.
Nota: Questo pacchetto non può essere utilizzato nel browser a causa di limitazioni del servizio, si prega di consultare questo documento per indicazioni.
Prerequisiti
- Un abbonamento Azure
- Un account Container Registry
Per creare un nuovo Registro dei Container, puoi usare i Azure Portal, Azure PowerShell o Azure CLI. Ecco un esempio usando la Azure CLI:
az acr create --name MyContainerRegistry --resource-group MyResourceGroup --location westus --sku Basic
Installare il pacchetto @azure/container-registry
Installare la libreria client del Registro Container per JavaScript con npm:
npm install @azure/container-registry
Autenticare il client
La libreria Identity Azure offre un semplice supporto Azure Active Directory per l'autenticazione.
import { ContainerRegistryClient, KnownContainerRegistryAudience } from "@azure/container-registry";
import { DefaultAzureCredential } from "@azure/identity";
const endpoint = "https://myregistryname.azurecr.io";
// Create a ContainerRegistryClient that will authenticate through Active Directory
const client = new ContainerRegistryClient(endpoint, new DefaultAzureCredential(), {
audience: KnownContainerRegistryAudience.AzureResourceManagerPublicCloud,
});
Nota che questi esempi presuppongono che tu abbia impostato una CONTAINER_REGISTRY_ENDPOINT variabile ambientale, ovvero l'URL che include il nome del server di login e il https:// prefisso.
Cloud nazionali
Per autenticarti con un registro in un National Cloud, dovrai apportare le seguenti aggiunte alla tua configurazione:
- Imposta la
authorityHostvariabile nelle opzioni di credenziali o tramite laAZURE_AUTHORITY_HOSTvariabile ambiente - Impostare il
audienceinContainerRegistryClientOptions
import { ContainerRegistryClient, KnownContainerRegistryAudience } from "@azure/container-registry";
import { DefaultAzureCredential, AzureAuthorityHosts } from "@azure/identity";
const endpoint = "https://myregistryname.azurecr.cn";
// Create a ContainerRegistryClient that will authenticate through AAD in the China national cloud
const client = new ContainerRegistryClient(
endpoint,
new DefaultAzureCredential({ authorityHost: AzureAuthorityHosts.AzureChina }),
{
audience: KnownContainerRegistryAudience.AzureResourceManagerChina,
},
);
Per maggiori informazioni sull'uso di AAD con Azure Container Registry, consulta la Authentication Overview del servizio.
Concetti chiave
Un registro memorizza immagini Docker e artefatti OCI. Un'immagine o un artefatto è costituito da un manifesto e livelli. Il manifesto di un'immagine descrive gli strati che compongono l'immagine ed è identificato in modo unico dal suo digest. Un'immagine può anche essere "taggata" per darle un alias leggibile dall'uomo. Un'immagine o un artefatto può avere zero o più tag associati, e ogni tag identifica unicamente l'immagine. Una raccolta di immagini che condivide lo stesso nome ma con tag diversi è chiamata repository.
Per ulteriori informazioni consulta Concept di Registro Container.
Examples
Operazioni del Registro di sistema
Elenco dei repository
Scorrere la raccolta di repository nel registro.
import { ContainerRegistryClient, KnownContainerRegistryAudience } from "@azure/container-registry";
import { DefaultAzureCredential } from "@azure/identity";
const endpoint = "https://myregistryname.azurecr.io";
const client = new ContainerRegistryClient(endpoint, new DefaultAzureCredential(), {
audience: KnownContainerRegistryAudience.AzureResourceManagerPublicCloud,
});
const iterator = client.listRepositoryNames();
for await (const repository of iterator) {
console.log(` repository: ${repository}`);
}
Tag elenco con accesso anonimo
import { ContainerRegistryClient, KnownContainerRegistryAudience } from "@azure/container-registry";
const endpoint = "https://myregistryname.azurecr.io";
// Create a new ContainerRegistryClient for anonymous access
const client = new ContainerRegistryClient(endpoint, {
audience: KnownContainerRegistryAudience.AzureResourceManagerPublicCloud,
});
// Obtain a RegistryArtifact object to get access to image operations
const image = client.getArtifact("library/hello-world", "latest");
// List the set of tags on the hello_world image tagged as "latest"
const tagIterator = image.listTagProperties();
// Iterate through the image's tags, listing the tagged alias for the image
console.log(`${image.fullyQualifiedReference} has the following aliases:`);
for await (const tag of tagIterator) {
console.log(` ${tag.registryLoginServer}/${tag.repositoryName}:${tag.name}`);
}
Modificare le proprietà degli elementi
import { ContainerRegistryClient, KnownContainerRegistryAudience } from "@azure/container-registry";
import { DefaultAzureCredential } from "@azure/identity";
const endpoint = "https://myregistryname.azurecr.io";
const client = new ContainerRegistryClient(endpoint, new DefaultAzureCredential(), {
audience: KnownContainerRegistryAudience.AzureResourceManagerPublicCloud,
});
const image = client.getArtifact("library/hello-world", "v1");
// Set permissions on the image's "latest" tag
await image.updateTagProperties("latest", { canWrite: false, canDelete: false });
Eliminare le immagini
import { ContainerRegistryClient, KnownContainerRegistryAudience } from "@azure/container-registry";
import { DefaultAzureCredential } from "@azure/identity";
const endpoint = "https://myregistryname.azurecr.io";
const client = new ContainerRegistryClient(endpoint, new DefaultAzureCredential(), {
audience: KnownContainerRegistryAudience.AzureResourceManagerPublicCloud,
});
// 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 `order` option
const imageManifests = repository.listManifestProperties({
order: "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();
}
}
}
Operazioni di blob e manifesti
Caricare immagini
import { ContainerRegistryContentClient } from "@azure/container-registry";
import { DefaultAzureCredential } from "@azure/identity";
const endpoint = "https://myregistryname.azurecr.io";
const repository = "library/hello-world";
const client = new ContainerRegistryContentClient(
endpoint,
repository,
new DefaultAzureCredential(),
);
const config = Buffer.from("Sample config");
const { digest: configDigest, sizeInBytes: configSize } = await client.uploadBlob(config);
const layer = Buffer.from("Sample layer");
const { digest: layerDigest, sizeInBytes: layerSize } = await client.uploadBlob(layer);
const manifest = {
schemaVersion: 2,
config: {
digest: configDigest,
size: configSize,
mediaType: "application/vnd.oci.image.config.v1+json",
},
layers: [
{
digest: layerDigest,
size: layerSize,
mediaType: "application/vnd.oci.image.layer.v1.tar",
},
],
};
await client.setManifest(manifest, { tag: "demo" });
Scarica immagini
import {
ContainerRegistryContentClient,
KnownManifestMediaType,
OciImageManifest,
} from "@azure/container-registry";
import { DefaultAzureCredential } from "@azure/identity";
import { writeFileSync, createWriteStream } from "node:fs";
const endpoint = "https://myregistryname.azurecr.io";
const repository = "library/hello-world";
const client = new ContainerRegistryContentClient(
endpoint,
repository,
new DefaultAzureCredential(),
);
// Download the manifest to obtain the list of files in the image based on the tag
const result = await client.getManifest("demo");
if (result.mediaType !== KnownManifestMediaType.OciImageManifest) {
throw new Error("Expected an OCI image manifest");
}
const manifest = result.manifest as OciImageManifest;
// Manifests of all media types have a buffer containing their content; this can be written to a file.
writeFileSync("manifest.json", result.content);
const configResult = await client.downloadBlob(manifest.config.digest);
const configFile = createWriteStream("config.json");
configResult.content.pipe(configFile);
const trimSha = (digest: string): string => {
const index = digest.indexOf(":");
return index === -1 ? digest : digest.substring(index);
};
// Download and write out the layers
for (const layer of manifest.layers) {
const fileName = trimSha(layer.digest);
const layerStream = createWriteStream(fileName);
const downloadLayerResult = await client.downloadBlob(layer.digest);
downloadLayerResult.content.pipe(layerStream);
}
Elimina manifesto
import { ContainerRegistryContentClient } from "@azure/container-registry";
import { DefaultAzureCredential } from "@azure/identity";
const endpoint = "https://myregistryname.azurecr.io";
const repository = "library/hello-world";
const client = new ContainerRegistryContentClient(
endpoint,
repository,
new DefaultAzureCredential(),
);
const downloadResult = await client.getManifest("latest");
await client.deleteManifest(downloadResult.digest);
Elimina blob
import {
ContainerRegistryContentClient,
KnownManifestMediaType,
OciImageManifest,
} from "@azure/container-registry";
import { DefaultAzureCredential } from "@azure/identity";
const endpoint = "https://myregistryname.azurecr.io";
const repository = "library/hello-world";
const client = new ContainerRegistryContentClient(
endpoint,
repository,
new DefaultAzureCredential(),
);
const downloadResult = await client.getManifest("latest");
if (downloadResult.mediaType !== KnownManifestMediaType.OciImageManifest) {
throw new Error("Expected an OCI image manifest");
}
for (const layer of (downloadResult.manifest as OciImageManifest).layers) {
await client.deleteBlob(layer.digest);
}
Risoluzione dei problemi
Per informazioni sulla risoluzione dei problemi, consulta la guida troubleshooting guide.
Passaggi successivi
Dai un'occhiata alla directory samples per esempi dettagliati che dimostrano come utilizzare le librerie client.
Contributing
Se desideri contribuire a questa libreria, leggi la guida contributi per saperne di più su come costruire e testare il codice.
Progetti correlati
Azure SDK for JavaScript