biblioteka klienta Azure Container Registry dla języka JavaScript — wersja 1.1.0
Azure Container Registry umożliwia przechowywanie obrazów kontenerów i artefaktów oraz zarządzanie nimi w prywatnym rejestrze dla wszystkich typów wdrożeń kontenerów.
Użyj biblioteki klienta, aby Azure Container Registry:
- Wyświetlanie listy obrazów lub artefaktów w rejestrze
- Uzyskiwanie metadanych dla obrazów i artefaktów, repozytoriów i tagów
- Ustawianie właściwości odczytu/zapisu/usuwania w elementach rejestru
- Usuwanie obrazów i artefaktów, repozytoriów i tagów
Kluczowe linki:
- Kod źródłowy
- Pakiet (NPM)
- Dokumentacja referencyjna interfejsu API
- Dokumentacja interfejsu API REST
- Dokumentacja produktu
- Samples
Wprowadzenie
Obecnie obsługiwane środowiska
Aby uzyskać więcej informacji, zobacz nasze zasady pomocy technicznej .
Uwaga: ten pakiet nie może być używany w przeglądarce ze względu na ograniczenia usługi. Zapoznaj się z tym dokumentem , aby uzyskać wskazówki.
Wymagania wstępne
Aby utworzyć nowy rejestr kontenerów, możesz użyć witryny Azure Portal, Azure PowerShell lub interfejsu wiersza polecenia platformy Azure. Oto przykład użycia interfejsu wiersza polecenia platformy Azure:
az acr create --name MyContainerRegistry --resource-group MyResourceGroup --location westus --sku Basic
Instalowanie pakietu @azure/container-registry
Zainstaluj bibliotekę klienta usługi Container Registry dla języka JavaScript przy użyciu polecenia npm
:
npm install @azure/container-registry
Uwierzytelnianie klienta
Biblioteka tożsamości platformy Azure zapewnia łatwą obsługę usługi Azure Active Directory na potrzeby uwierzytelniania.
const {
ContainerRegistryClient,
KnownContainerRegistryAudience,
} = 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(), {
audience: KnownContainerRegistryAudience.AzureResourceManagerPublicCloud,
});
Należy pamiętać, że te przykłady zakładają, że masz CONTAINER_REGISTRY_ENDPOINT
zestaw zmiennych środowiskowych, który jest adresem URL, w tym nazwą serwera logowania i prefiksem https://
.
Chmury krajowe
Aby uwierzytelnić się w rejestrze w chmurze krajowej, należy dodać następujące dodatki do konfiguracji:
authorityHost
Ustaw wartość w opcjach poświadczeń lub za pomocą zmiennej środowiskowejAZURE_AUTHORITY_HOST
- Ustaw wartość
audience
wContainerRegistryClientOptions
const {
ContainerRegistryClient,
KnownContainerRegistryAudience,
} = require("@azure/container-registry");
const { DefaultAzureCredential, AzureAuthorityHosts } = require("@azure/identity");
const endpoint = process.env.CONTAINER_REGISTRY_ENDPOINT;
// 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,
}
);
Aby uzyskać więcej informacji na temat korzystania z usługi AAD z Azure Container Registry, zobacz Omówienie uwierzytelniania usługi.
Kluczowe pojęcia
Rejestr przechowuje obrazy platformy Docker i artefakty OCI. Obraz lub artefakt składa się z manifestu i warstw. Manifest obrazu opisuje warstwy tworzące obraz i są jednoznacznie identyfikowane przez jego skrót. Obraz może być również "oznakowany", aby nadać mu alias czytelny dla człowieka. Obraz lub artefakt może mieć skojarzone z nim zero lub więcej tagów , a każdy tag jednoznacznie identyfikuje obraz. Kolekcja obrazów, które mają taką samą nazwę, ale mają różne tagi, jest nazywana repozytorium.
Aby uzyskać więcej informacji, zobacz Pojęcia dotyczące usługi Container Registry.
Przykłady
Operacje rejestru
Wyświetlanie listy repozytoriów
Iteracja przez kolekcję repozytoriów w rejestrze.
const {
ContainerRegistryClient,
KnownContainerRegistryAudience,
} = 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(), {
audience: KnownContainerRegistryAudience.AzureResourceManagerPublicCloud,
});
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);
});
Wyświetlanie listy tagów z dostępem anonimowym
const {
ContainerRegistryClient,
KnownContainerRegistryAudience,
} = require("@azure/container-registry");
async function main() {
// Get the service endpoint from the environment
const endpoint = process.env.CONTAINER_REGISTRY_ENDPOINT || "<endpoint>";
// 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}`);
}
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
Ustawianie właściwości artefaktu
const {
ContainerRegistryClient,
KnownContainerRegistryAudience,
} = 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(), {
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 });
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
Usuwanie obrazów
const {
ContainerRegistryClient,
KnownContainerRegistryAudience,
} = 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(), {
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();
}
}
}
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
Operacje obiektów blob i manifestu
Przekazywanie obrazów
const { ContainerRegistryContentClient } = require("@azure/container-registry");
const { DefaultAzureCredential } = require("@azure/identity");
require("dotenv").config();
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 repository = process.env.CONTAINER_REGISTRY_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" });
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
Pobieranie obrazów
const {
ContainerRegistryContentClient,
KnownManifestMediaType,
} = require("@azure/container-registry");
const { DefaultAzureCredential } = require("@azure/identity");
const dotenv = require("dotenv");
const fs = require("fs");
dotenv.config();
function trimSha(digest) {
const index = digest.indexOf(":");
return index === -1 ? digest : digest.substring(index);
}
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 repository = process.env.CONTAINER_REGISTRY_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;
// Manifests of all media types have a buffer containing their content; this can be written to a file.
fs.writeFileSync("manifest.json", result.content);
const configResult = await client.downloadBlob(manifest.config.digest);
const configFile = fs.createWriteStream("config.json");
configResult.content.pipe(configFile);
// Download and write out the layers
for (const layer of manifest.layers) {
const fileName = trimSha(layer.digest);
const layerStream = fs.createWriteStream(fileName);
const downloadLayerResult = await client.downloadBlob(layer.digest);
downloadLayerResult.content.pipe(layerStream);
}
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
Usuwanie manifestu
const { ContainerRegistryContentClient } = require("@azure/container-registry");
const { DefaultAzureCredential } = require("@azure/identity");
require("dotenv").config();
async function main() {
// Get the service endpoint from the environment
const endpoint = process.env.CONTAINER_REGISTRY_ENDPOINT || "<endpoint>";
const repository = process.env.CONTAINER_REGISTRY_REPOSITORY || "library/hello-world";
// Create a new ContainerRegistryClient
const client = new ContainerRegistryContentClient(
endpoint,
repository,
new DefaultAzureCredential()
);
const downloadResult = await client.getManifest("latest");
await client.deleteManifest(downloadResult.digest);
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
Usuwanie obiektu blob
const {
ContainerRegistryContentClient,
KnownManifestMediaType,
} = require("@azure/container-registry");
const { DefaultAzureCredential } = require("@azure/identity");
require("dotenv").config();
async function main() {
// Get the service endpoint from the environment
const endpoint = process.env.CONTAINER_REGISTRY_ENDPOINT || "<endpoint>";
const repository = process.env.CONTAINER_REGISTRY_REPOSITORY || "library/hello-world";
// Create a new ContainerRegistryClient
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.layers) {
await client.deleteBlob(layer.digest);
}
}
Rozwiązywanie problemów
Aby uzyskać informacje na temat rozwiązywania problemów, zapoznaj się z przewodnikiem rozwiązywania problemów.
Następne kroki
Zapoznaj się z katalogiem samples , aby zapoznać się ze szczegółowymi przykładami, które pokazują, jak używać bibliotek klienta.
Współtworzenie
Jeśli chcesz współtworzyć tę bibliotekę, przeczytaj przewodnik współtworzenia , aby dowiedzieć się więcej na temat sposobu kompilowania i testowania kodu.
Powiązane projekty
Azure SDK for JavaScript