5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ECRの別リポジトリへコンテナイメージをコピーする

Posted at

背景

Amazon ECRで特定のコンテナイメージのみ提供することを実現するための要素の1つとして、
開発用のリポジトリからリリース用のリポジトリへコンテナイメージをコピーしたい

実現したいこと

開発用リポジトリの特定のコンテナイメージを、リリース用リポジトリにコピーする

実現方法

EC2上で、開発用リポジトリからコンテナイメージをプルし、リリース用リポジトリにプッシュする
(将来的にはCodeBuildなどで自動化したい)

Amazon ECRアクセス用EC2の構築

Amazon ECR での AWS CLI の使用を参考に、構築していく

EC2構築の手順は省略するが、以下リソースを使用した

  • インスタンスタイプ:t2.micro
  • OS:Amazon Linux 2

Amazon ECRにアクセスするためにはAWS CLIとDockerが必要なようだが、Amazon Linux 2 AMIにはAWS CLIは元から入っている

$ aws --version
aws-cli/1.18.147 Python/2.7.18 Linux/4.14.225-169.362.amzn2.x86_64 botocore/1.18.6

サイトの手順に従いDockerをインストールする

sudo yum update -y
sudo amazon-linux-extras install docker
sudo service docker start
sudo usermod -a -G docker ec2-user
docker info
$ docker --version
Docker version 19.03.13-ce, build 4484c46

リポジトリへの認証

今回のリポジトリは、公開しない(or一部のAWSアカウントにしか公開しない)ためにプライベートリポジトリを使用しているので、プライベートレジストリ認証を参考に実施していく

Amazon ECRがDocker CLIのリクエストを認証・承認できるようにするための手順を実行する必要があるとのこと

AWS CLIをセットアップする

$ aws configure

AmazonECRプライベートレジストリに対してDockerを認証させる

$ aws ecr get-login-password --region {region} | docker login --username AWS --password-stdin {aws_account_id}.dkr.ecr.{region}.amazonaws.com

事前確認

リポジトリを確認する

$ aws ecr describe-repositories
{
    "repositories": [
        {
            "repositoryUri": "{aws_account_id}.dkr.ecr.{region}.amazonaws.com/release",
            "imageScanningConfiguration": {
                "scanOnPush": false
            },
            "encryptionConfiguration": {
                "encryptionType": "AES256"
            },
            "registryId": "{aws_account_id}",
            "imageTagMutability": "MUTABLE",
            "repositoryArn": "arn:aws:ecr:{region}:{aws_account_id}:repository/release",
            "repositoryName": "release",
            "createdAt": 1617367993.0
        },
        {
            "repositoryUri": "{aws_account_id}.dkr.ecr.{region}.amazonaws.com/develop",
            "imageScanningConfiguration": {
                "scanOnPush": false
            },
            "encryptionConfiguration": {
                "encryptionType": "AES256"
            },
            "registryId": "{aws_account_id}",
            "imageTagMutability": "MUTABLE",
            "repositoryArn": "arn:aws:ecr:{region}:{aws_account_id}:repository/develop",
            "repositoryName": "develop",
            "createdAt": 1617367563.0
        }
    ]
}

releaseリポジトリと、developリポジトリがあることがわかる

developリポジトリのコンテナイメージを確認する

$ aws ecr describe-images --repository-name develop
{
    "imageDetails": [
        {
            "artifactMediaType": "application/vnd.docker.container.image.v1+json",
            "imageSizeInBytes": 83920901,
            "imageDigest": "sha256:255d71ecc31ed42351dbc809905360aec3421a6544759315988d26ea114363b3",
            "imageManifestMediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "imageTags": [
                "v1.0"
            ],
            "registryId": "{aws_account_id}",
            "repositoryName": "develop",
            "imagePushedAt": 1617372606.0
        }
    ]
}

イメージタグv1.0のコンテナイメージがあることがわかる

releaseリポジトリのコンテナイメージを確認する

$ aws ecr describe-images --repository-name release
{
    "imageDetails": []
}

コンテナイメージが無いことがわかる

EC2上のコンテナイメージを確認する

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

コンテナイメージがないことがわかる

開発用リポジトリからコンテナイメージのプル

イメージのプルを参考に実施していく

developレジストリからイメージタグv1.0のコンテナイメージをプルする

$ docker pull {aws_account_id}.dkr.ecr.{region}.amazonaws.com/develop:v1.0

EC2上のコンテナイメージを確認する

$ docker images
REPOSITORY                                                  TAG                 IMAGE ID            CREATED             SIZE
{aws_account_id}.dkr.ecr.{region}.amazonaws.com/develop   v1.0                935e47d46598        2 days ago          196MB

コンテナイメージをプルできたことがわかる

リリース用リポジトリへのコンテナイメージのプッシュ

Dockerイメージをプッシュするを参考に実施していく

プッシュするコンテナイメージのイメージIDを特定する

$ docker images
REPOSITORY                                                  TAG                 IMAGE ID            CREATED             SIZE
{aws_account_id}.dkr.ecr.{region}.amazonaws.com/develop   v1.0                935e47d46598        2 days ago          196MB

プッシュするコンテナイメージに、プル先のリポジトリ情報をタグ付けする

docker tag {イメージID} {aws_account_id}.dkr.ecr.{region}.amazonaws.com/{リポジトリ名}:{イメージタグ}

タグ付けできたことを確認する

$ docker images
REPOSITORY                                                  TAG                 IMAGE ID            CREATED             SIZE
{aws_account_id}.dkr.ecr.{region}.amazonaws.com/develop   v1.0                935e47d46598        2 days ago          196MB
{aws_account_id}.dkr.ecr.{region}.amazonaws.com/release   v1.0                935e47d46598        2 days ago          196MB

タグ付けできたことがわかる

コンテナイメージをプッシュする

docker push {aws_account_id}.dkr.ecr.{region}.amazonaws.com/{リポジトリ名}:{イメージタグ}

事後確認

releaseリポジトリのコンテナイメージを確認する

$ aws ecr describe-images --repository-name release`
{
    "imageDetails": [
        {
            "artifactMediaType": "application/vnd.docker.container.image.v1+json",
            "imageSizeInBytes": 83920901,
            "imageDigest": "sha256:255d71ecc31ed42351dbc809905360aec3421a6544759315988d26ea114363b3",
            "imageManifestMediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "imageTags": [
                "v1.0"
            ],
            "registryId": "{aws_account_id}",
            "repositoryName": "release",
            "imagePushedAt": 1617543739.0
        }
    ]
}

releaseリポジトリにイメージタグv1.0のコンテナイメージをプッシュできたことがわかる

各リポジトリのコンテナイメージのimageDigestが一致することから、コピーできたことがわかる

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?