AWS CLIを使ってECRにDockerイメージを登録する

事業開発部の野村です。

自前のDockerイメージをECRに登録する機会があったのでその時に行った手順をおさらいしてみました。大抵はCI等で設定してアプリケーションの更新が入った時に自動化する手順ではありますが、改めてどのようなステップを踏んでいるかを振り返る意味も込めて手順化してます。

目次

前提

AWS CLIとDockerを使います。

利用するリージョンは ap-northeast-1 とします。以降の手順でも使うので環境変数に登録しておきます。

AWS_REGION=ap-northeast-1

イメージ登録手順

リポジトリの作成

create-repository を使ってまずはリポジトリを作ります。 今回作るリポジトリ名は echo-test とします。

REPOSITORY_NAME=echo-test
aws ecr create-repository --repository-name ${REPOSITORY_NAME} --region ${AWS_REGION}
{
    "repository": {
        "registryId": "xxxxxxxxxxxx",
        "repositoryName": "echo-test",
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:xxxxxxxxxxxx:repository/echo-test",
        "createdAt": 1565101668.0,
        "repositoryUri": "xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/echo-test"
    }
}

describe-repositories を使って、作成したリポジトリが存在するか確認します。

aws ecr describe-repositories --region ${AWS_REGION}
{
    "repository": {
        "registryId": "xxxxxxxxxxxx",
        "repositoryName": "echo-test",
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:xxxxxxxxxxxx:repository/echo-test",
        "createdAt": 1565101668.0,
        "repositoryUri": "xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/echo-test"
    }
}

registryIdは以降の手順で使う値なので、こちらも環境変数に登録しておきます。

REGISTRY_ID=xxxxxxxxxxxx

Dockerログイン

docker コマンドのpush先をAWS ECRに向ける設定をするため、以下の get-login を実行します。

aws ecr get-login --region ${AWS_REGION} --no-include-email

出力された以下のコマンドを実行します。

docker login -u AWS -p {認証トークン} https://xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com

以下のコマンドだと一発で docker login まで完了できます。

$(aws ecr get-login --region ${AWS_REGION} --no-include-email)

Dockerイメージのプッシュ

今回の説明用にごくシンプルなDockerfileを用意しました。こちらを元にイメージを作ります。

Dockerfileが存在するディレクトリで、{レジストリID}.dkr.ecr.{リージョン}.amazonaws.com/{リポジトリ名}:{タグ名} という形式でタグを付けてDockerイメージをビルドします。 仮にタグ名を v1.0 とします。

docker build -t ${REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${REPOSITORY_NAME}:v1.0 .

ビルド完了したら、ECRに対してプッシュします。

docker push ${REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${REPOSITORY_NAME}:v1.0

同じリポジトリに複数のタグをプッシュできるためその確認も行います。 Dockerfileをちょっと修正して、違うタグ( v2.0 )を付けてビルドします。

docker build -t ${REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${REPOSITORY_NAME}:v2.0 .

ビルド完了したら、ECRにプッシュします。

docker push ${REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${REPOSITORY_NAME}:v2.0

プッシュしたイメージの確認

list-images を使って、先程プッシュした2つのイメージを確認します。

aws ecr list-images --repository-name ${REPOSITORY_NAME} --region ${AWS_REGION}
{
    "imageIds": [
        {
            "imageTag": "v1.0",
            "imageDigest": "sha256:yyyyy"
        },
        {
            "imageTag": "v2.0",
            "imageDigest": "sha256:zzzzz"
        }
    ]
}

v1.0 , v2.0 のタグでイメージがそれぞれ存在することを確認できました。

後片付け

ECRにプッシュしたイメージやリポジトリを今後使うことがない場合は削除しておきましょう。

イメージを削除する場合は batch-delete-image を使います。

aws ecr batch-delete-image --repository-name ${REPOSITORY_NAME} --image-ids imageTag=v1.0
aws ecr batch-delete-image --repository-name ${REPOSITORY_NAME} --image-ids imageTag=v2.0

リポジトリを削除する場合は delete-repository を使います。

aws ecr delete-repository --repository-name ${REPOSITORY_NAME}

また、ローカルでビルドしたイメージも不要なら docker rmi コマンドで削除しましょう。

docker rmi ${REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${REPOSITORY_NAME}:v1.0
docker rmi ${REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${REPOSITORY_NAME}:v2.0

まとめ

ということで、AWS CLIを使ってECRにDockerイメージを登録する手順をご紹介させていただきました。 ECRのコマンドは上記で紹介した以外にもありますので、以下のドキュメントを合わせて参考にしてください。