JavaScript için Azure Container Registry istemci kitaplığı - sürüm 1.1.0
Azure Container Registry, kapsayıcı görüntülerini ve yapıtlarını her tür kapsayıcı dağıtımı için özel bir kayıt defterinde depolamanıza ve yönetmenize olanak tanır.
Azure Container Registry için istemci kitaplığını kullanın:
- Kayıt defterindeki görüntüleri veya yapıtları listeleme
- Görüntüler ve yapıtlar, depolar ve etiketler için meta verileri alma
- Kayıt defteri öğelerinde okuma/yazma/silme özelliklerini ayarlama
- Görüntüleri ve yapıtları, depoları ve etiketleri silme
Önemli bağlantılar:
Başlarken
Şu anda desteklenen ortamlar
Daha fazla ayrıntı için destek ilkemize bakın.
Not: Hizmet sınırlamaları nedeniyle bu paket tarayıcıda kullanılamıyor, rehberlik için lütfen bu belgeye bakın.
Önkoşullar
Yeni bir Container Registry oluşturmak için Azure Portal, Azure PowerShell veya Azure CLI kullanabilirsiniz. Aşağıda Azure CLI'yi kullanan bir örnek verilmişti:
az acr create --name MyContainerRegistry --resource-group MyResourceGroup --location westus --sku Basic
@azure/container-registry
paketini yükleyin
ile npm
JavaScript için Container Registry istemci kitaplığını yükleyin:
npm install @azure/container-registry
İstemcinin kimliğini doğrulama
Azure Kimlik kitaplığı, kimlik doğrulaması için kolay Azure Active Directory desteği sağlar.
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,
});
Bu örneklerin, oturum açma sunucusunun adı ve ön eki de dahil olmak üzere URL olan bir CONTAINER_REGISTRY_ENDPOINT
ortam değişken kümesine sahip olduğunuzu varsaydığını https://
unutmayın.
Ulusal Bulutlar
Ulusal Bulut'taki bir kayıt defteriyle kimlik doğrulaması yapmak için yapılandırmanıza aşağıdaki eklemeleri yapmanız gerekir:
authorityHost
kimlik bilgisi seçeneklerinde veya ortam değişkeni aracılığıylaAZURE_AUTHORITY_HOST
değerini ayarlayın- şu ayarı ayarlayın:
audience
ContainerRegistryClientOptions
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,
}
);
AAD'yi Azure Container Registry ile kullanma hakkında daha fazla bilgi için lütfen hizmetin Kimlik Doğrulamasına Genel Bakış bölümüne bakın.
Önemli kavramlar
Kayıt defteri Docker görüntülerini ve OCI Yapıtlarını depolar. Görüntü veya yapıt bildirim vekatmanlardan oluşur. Görüntünün bildirimi, görüntüyü oluşturan katmanları açıklar ve özetiyle benzersiz bir şekilde tanımlanır. Bir resim, insan tarafından okunabilen bir diğer ad vermek için "etiketlenebilir" de olabilir. Görüntü veya yapıtla ilişkilendirilmiş sıfır veya daha fazla etiket olabilir ve her etiket görüntüyü benzersiz olarak tanımlar. Aynı adı paylaşan ancak etiketleri farklı olan bir görüntü koleksiyonuna depo adı verilir.
Daha fazla bilgi için bkz. Kapsayıcı Kayıt Defteri Kavramları.
Örnekler
Kayıt defteri işlemleri
Depoları listeleme
Kayıt defterindeki depoların koleksiyonu aracılığıyla yineleyin.
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);
});
Anonim erişimli etiketleri listeleme
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);
});
Yapıt özelliklerini ayarlama
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);
});
Görüntüleri silme
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);
});
Blob ve bildirim işlemleri
Görüntüleri karşıya yükleme
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);
});
Görüntüleri indirme
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);
});
Bildirimi sil
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);
});
Blobu silme
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);
}
}
Sorun giderme
Sorun giderme hakkında bilgi için sorun giderme kılavuzuna bakın.
Sonraki adımlar
İstemci kitaplıklarının nasıl kullanılacağını gösteren ayrıntılı örnekler için lütfen samples dizinine göz atın.
Katkıda bulunma
Bu kitaplığa katkıda bulunmak isterseniz, kodu derleme ve test etme hakkında daha fazla bilgi edinmek için lütfen katkıda bulunma kılavuzunu okuyun.
İlgili projeler
Azure SDK for JavaScript