コンテナレジストリを造る方法


KubernetesやServerlessで動作しているかどうか、アプリケーションはコンテナを使用します.Dockerデスクトップクライアントを使用する場合、イメージはデフォルトでDocker Hubにプッシュされます.Docker Hubからイメージを引くことは便利です、しかし、あなた自身のレジストリでイメージを保存する多くの理由があります.例えば、ドッカーハブは、繰り返されるプルの上で同じイメージを生産することを保証しません.また、誤ってDockerハブに格納されたイメージを構築するために使用される中間画像の秘密を公開することも可能です.また、公式イメージの脆弱性の可能性もあります.この記事では、リポジトリを作成する方法と、そのリポジトリにイメージをビルドしてプッシュする方法を示します

コンテナ登録品
AWSはElastic Container Registry (ECR) , 瑠璃Container Registry , そしてグーグルはContainer Registry . 各々のプロバイダーはサービスを彼らの提供にユニークなものと関連づけました、しかし、すべてのサポートDockerまたはOCI準拠イメージ.

ビルドイット
あなたの選択のプロバイダーでレジストリを作成する方法を調べましょう.これらの例では、レジストリを作成し、Docker画像を作成し、レジストリにイメージをプッシュします.The application イメージに使用されるnginxです.
レジストリを構築する方法を学ぶためにクラウドプロバイダを選択します.この例ではAWSを使用しますが、azureとgcpの例を見つけることができます.
この例では、イメージのオペレーティングシステムコンポーネントをスキャンするように構成されたECRリポジトリを作成します.アプリケーションの脆弱性のスキャンは現在out of scope . また、許可された動作を制御するリポジトリのポリシーと、設定された時間後にイメージを期限切れにするライフサイクルポリシーを設定します.
Pulumiでは、ローカルでDockerを使用してイメージを構築し、リポジトリにプッシュすることが可能です.画像をプッシュするには、レジストリからプッシュするために必要な資格情報を取得します.最後に、レジストリの資格情報とURLをエクスポートします.年にECRについてもっと読んでくださいAPI Reference .
import * as docker from "@pulumi/docker";
import * as aws from "@pulumi/aws";

// Create a repository and configure to scan the image on push
const repo = new aws.ecr.Repository("myrepository", {
    imageScanningConfiguration: {
        scanOnPush: true
    },
    imageTagMutability: "MUTABLE",
});

// Set a use policy for the repository
const repositoryPolicy = new aws.ecr.RepositoryPolicy("myrepositorypolicy", {
    repository: repo.id,
    policy: JSON.stringify({
        Version: "2012-10-17",
        Statement: [{
            Sid: "new policy",
            Effect: "Allow",
            Principal: "*",
            Action: [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:DescribeRepositories",
                "ecr:GetRepositoryPolicy",
                "ecr:ListImages",
                "ecr:DeleteRepository",
                "ecr:BatchDeleteImage",
                "ecr:SetRepositoryPolicy",
                "ecr:DeleteRepositoryPolicy"
            ]
        }]
    })
});

// Set a policy to control the lifecycle of an image
const lifecyclePolicy = new aws.ecr.LifecyclePolicy("mylifecyclepolicy", {
    repository: repo.id,
    policy: JSON.stringify({
        rules: [{
            rulePriority: 1,
            description: "Expire images older than 14 days",
            selection: {
                tagStatus: "untagged",
                countType: "sinceImagePushed",
                countUnit: "days",
                countNumber: 14
            },
            action: {
                type: "expire"
            }
        }]
    })
});

// Get the repository credentials we use to push to the repository
const repoCreds = repo.registryId.apply(async (registryId) => {
    const credentials = await aws.ecr.getCredentials({
        registryId: registryId,
    });
    const decodedCredentials = Buffer.from(credentials.authorizationToken, "base64").toString();
    const [username, password] = decodedCredentials.split(":");
    return { server: credentials.proxyEndpoint, username, password };
});

// Create a new image and push to the repository
const image = new docker.Image("myapp", {
    imageName: repo.repositoryUrl,
    build: "./app",
    registry: repoCreds,
})

// Export credentials and URL to the repository
export const credentials = repoCreds;
export const repoEndpoint = repo.repositoryUrl;

もっと学ぶ
コンテナ登録は、現代のアプリケーションを展開するのに使用される多くのリソースのうちの1つです.クラウドサービスプロバイダ間の実装は、提供する機能とどのように展開されるかによって異なります.それらの間の共通性は、彼らがDockerまたはOCIコンプライアンスコンテナイメージを格納して、取り出す安全な場所を提供するということです.Pulumiであなたの選んだ方の雲サービスプロバイダーのために資源をつくって、管理する方法を調査してください.始めたい場所は