こんにちは、ニキです。
今回の記事では、ECRにDockerイメージをpushする手順を解説します。
ECRリポジトリにイメージを登録しておくと、ECS等のコンテナサービスから使用できます。
ECRにDockerイメージをpushする手順は以下の流れです。
- レジストリに対して Docker CLIを認証
- ECRリポジトリを作成
- ローカルのDockerイメージにECRリポジトリのURIをタグ付け
- DockerイメージをECRリポジトリへpush
それでは、解説していきます。
ECRレジストリに対してDocker CLIを認証
ECRへイメージをpushするために、レジストリに対して Docker CLIを認証します。
すでに認証済みの場合は、このステップは不要です。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.ap-northeast-1.amazonaws.com
認証に成功すると以下のように出力されます。
Login Succeeded
ECRリポジトリを作成
ECRリポジトリを作成します。
以下では、hello-repositoryというリポジトリをap-northeast-1に作成しています。profileのrigionと同じでよければ指定不要です。
aws ecr create-repository --repository-name hello-repository --region ap-northeast-1
以下のように出力されます。
{
"repository": {
"repositoryArn": "arn:aws:ecr:ap-northeast-1:aws_account_id:repository/hello-repository",
"registryId": "aws_account_id",
"repositoryName": "hello-repository",
"repositoryUri": "aws_account_id.dkr.ecr.ap-northeast-1.amazonaws.com/hello-repository",
"createdAt": "2023-10-07T13:28:35+09:00",
"imageTagMutability": "MUTABLE",
"imageScanningConfiguration": {
"scanOnPush": false
},
"encryptionConfiguration": {
"encryptionType": "AES256"
}
}
}
ECRコンソール上では、以下のように作成されていることを確認できます。
ECRにDockerイメージをpush
Dockerイメージの作成
以下のようなDockerfileを想定しています。
FROM php:8.2.8-fpm
COPY --from=composer /usr/bin/composer /usr/bin/composer
COPY ./src /var/www/html/example
RUN docker-php-ext-install pdo_mysql
Nginxの設定ファイルに環境変数を用いたいので、テンプレートファイルを使用しています。fastcgi_passの値を開発環境とECSで分ける必要があります。
FROM nginx:1.25.1
COPY ./default.conf.template /etc/nginx/templates/default.conf.template
COPY ./src /var/www/html/example
Nginxの設定ファイルです。PHP_HOSTが環境変数の値に置換されます。
server {
listen 80;
listen [::]:80;
server_name localhost;
root /var/www/html/example/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass ${PHP_HOST}:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
pushするイメージ作成をするための方法を3パターン紹介します。
ビルドするパターン
DockerfileからDockerイメージを作成します。実際のCDパイプラインでは毎度ビルドするので、この方法で作成するとDockerfileの安心感があります。
docker build --tag AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/php --file php.Dockerfile .
docker build --tag AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/nginx --file nginx.Dockerfile .
コンテナから作成するパターン
作成済みのコンテナから作成します。ローカル環境で動作確認しているので、安心感があります。
docker commit php AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/php
docker commit php AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/nginx
イメージにタグ付けするパターン
タグ付けを後から行いたい場合に便利な方法です。
docker tag hello-world aws_account_id.dkr.ecr.ap-northeast-1.amazonaws.com/hello-repository
以下のようにタグ付けされます。
hello-world 1.25.1 ff78c7a65ec2 2 months ago 192MB
AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/hello-repository latest ff78c7a65ec2 2 months ago 192MB
Dockerイメージをpush
DockerイメージをECRリポジトリへpushします。
docker push AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/php
docker push AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/nginx
以下のように出力されれば成功です。
Using default tag: latest
The push refers to repository [aws_account_id.dkr.ecr.ap-northeast-1.amazonaws.com/hello-repository]
facf79a780de: Pushed
83cb32b689ff: Pushed
482f7b7b1b03: Pushed
3c6148273d48: Pushed
1e451eaa30b3: Pushed
b0ff37385ae9: Pushed
8450f74cd36b: Pushed
latest: digest: sha256:6faff3cb6b8c141d4828ac6c884a38a680ec6ad122c19397e4774f0bb9616f0c size: 1778
ECRコンソールのイメージ一覧の画面に以下のように表示されています。
まとめ
今回の記事では、ECRにDockerイメージをpushする手順を解説しました。