初学者向け：ローカルでDockerfileを作成し、AWS CLIでDockerイメージをECRにプッシュしてみた

## はじめに
AWSでDockerファイルを使用してコンテナイメージを実行する場合、ECR (Elastic Container Registry) にアップロードされたイメージを利用します。

:::note alert
**今回は、テスト用のファイルを準備し、ローカル環境でDockerイメージをビルドしてECRにプッシュする手順を解説します。**
:::

この記事は、将来の自分への備忘録として、学んだ内容を整理したものです。

## ECRについて

Amazon Elastic Container Registry (ECR) は、完全マネージド型のコンテナレジストリサービスです。

![スクリーンショット 2024-11-15 22.14.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/13d2fc67-34d5-71ff-8aa0-a0a7c695b610.png)
引用画像：https://zenn.dev/yoshii0110/articles/1de56128d7be2c

さらに詳しく学習されたい方は、AWSの公式サイトをご参照ください。

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/what-is-ecr.html

## テスト用ファイルの準備

### 1. Dockerfile
まず、AWS Lambdaで実行可能なDockerイメージを作成します。以下は、シンプルなPythonアプリケーションを例にしたDockerfileです。

```dockerfile
# AWS Lambdaの公式Pythonベースイメージ
FROM public.ecr.aws/lambda/python:3.9

# 必要なライブラリをインストール
COPY requirements.txt .
RUN pip install -r requirements.txt

# アプリケーションコードをコンテナにコピー
COPY app.py .

# Lambda関数のエントリーポイントを指定
CMD ["app.lambda_handler"]
```

### 2. app.py
`app.py` には、Lambda関数のエントリーポイントを定義します。以下はその例です。

```app.py
def lambda_handler(event, context):
    return {"statusCode": 200, "body": "Hello, Lambda with Docker!"}
```

### 3. requirements.txt
依存関係を管理するための `requirements.txt` ファイルには、必要なPythonライブラリを記載します。

```requirements.txt
flask==2.3.2
requests==2.28.1
```

このファイルは、Dockerfile内の `COPY` と `RUN` ステップで使用されます。

## Dockerイメージのビルド
以下のコマンドを実行して、Dockerイメージをビルドします。

```bash
docker build -t lambda-docker .
```

**コマンド実行例**

以下は、実行時の例です。

```bash
➜  test git:(honda-branch) ✗ docker build -t lambda-container .
[+] Building 6.5s (4/8)                                                                                        docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                           0.0s
 => => transferring dockerfile: 432B                                                                                           0.0s
 => [internal] load metadata for public.ecr.aws/lambda/python:3.9                                                              1.1s
・・・
・・・
・・・
What's next:
    View a summary of image vulnerabilities and recommendations → docker scout quickview 
```

**ポイント:**

- **`-t lambda-docker` でイメージに名前を付けています。**
- **ビルドに成功すると、Dockerイメージがローカルに作成されます。**

## ECRリポジトリの作成
AWS CLIを使用して、ECRリポジトリを作成します。

```bash
aws ecr create-repository --repository-name lambda-container
```

実行後、以下のようにリポジトリが作成されていることを確認できます。

![Screenshot 2025-01-13 at 20.55.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/8570cddb-0cf5-61bc-e4e0-38922272a477.png)

## ECRにDockerイメージをプッシュしてみた

AWS CLIを利用して、DockerイメージをECRにプッシュする手順を紹介します。

***普段はマネジメントコンソールで生成されるコマンドを使用していますが、ここでは簡単に一例をご紹介します。***

![Screenshot 2025-01-13 at 20.58.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a4e2dc01-1d11-5370-e51d-18634b30f9ce.png)

### 1. Dockerレジストリにログイン
AWS CLIを使って認証トークンを取得し、DockerクライアントをAWS ECRレジストリにログインさせます。

```bash
aws ecr get-login-password --region <REGION> | docker login --username AWS --password-stdin <ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com
```

### 2. Dockerイメージのビルド
Dockerfileを使用して、コンテナイメージをビルドします。

```bash
docker build -t <IMAGE_NAME> .
```

### 3. Dockerイメージにタグを付与
作成したDockerイメージにタグを付け、ECRリポジトリへプッシュできるようにします。

```bash
docker tag <IMAGE_NAME>:latest <ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/<IMAGE_NAME>:latest
```

### 4. DockerイメージをECRにプッシュ
タグ付けしたイメージをAWS ECRにプッシュします。

```bash
docker push <ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/<IMAGE_NAME>:latest
```

プッシュが成功すると、以下のようにECRにイメージが登録されていることが確認できます。

![Screenshot 2025-01-13 at 21.04.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/e3277794-424a-089e-fb80-1b8c2a03d672.png)


## まとめ
この記事では、AWS ECRを利用してDockerイメージを管理する手順を解説しました。

:::note info
**ECRを活用することで、コンテナイメージを効率的に保存・管理できる点が大きなメリットです。**
:::

***次回は、このコンテナイメージをAWS Lambdaで実行し、サーバーレス環境で動かす方法について解説します！***