Pythonプログラムを Dockerコンテナ化して Azure Container Registry (ACR) にプッシュしました


## 概要

手元にある Pythonプログラムをコンテナ化し、コンテナレジストリ（ACR）にプッシュする手順を簡単に説明しています

## ローカル環境

macOS Big Sur 11.3 
python 3.8.3
Docker version 20.10.7, build f0df350

## 前提条件

1. Azure環境がすでに用意されていること（テナント/サブスクリプション）。
2. ローカル環境に「azure cli」がインストールされていること。

## 事前準備

- ローカルの環境変数に以下を定義しておきます。
  - ACR_NAME=acr0ituru
  - ACR_RES_GROUP=rg_ituru_acr

---

## Azure にログイン

### azure cli バージョンの確認

```
$ az version                    

{
  "azure-cli": "2.26.1",
  "azure-cli-core": "2.26.1",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {
    "azure-iot": "0.10.13"
  }
}
```

### 使用するテナントのAzure環境へのログイン

```
$ az login --tenant <tenant_id>
```

### 使用サブスクリプションを定義します

```
$ az account set --subscription '<サブスクリプション名>'
```

---

## Azure Container Registry

### ACR リソースグループの作成

```
$ az group create --resource-group $ACR_RES_GROUP --location japaneast
```

### ACRのレジストリ作成

```
$ az acr create --resource-group $ACR_RES_GROUP --name $ACR_NAME --sku Standard --location japaneast
```

### ACRログインサーバーアドレスの取得

```
$ ACR_LOGIN_SERVER=$(az acr list --resource-group $ACR_RES_GROUP --query "[].{acrLoginServer:loginServer}" --output tsv)

$ echo $ACR_LOGIN_SERVER
acr0ituru.azurecr.io
```

---

## コンテナイメージの作成

### 作業ディレクトリ

```
$ tree                
.
├── Dockerfile
├── opt
│   └── IoTSampleData-v5.py
└── requirements.txt
```

### DockerFile

- ベースとなるイメージは slim を定義し、OSで必要な環境設定とネットワーク関連ツールを定義しておきます
- コンテナ化したい Python プログラムを optディレクトリ配下に配置しておき、Pythonプログラムに必要なライブラリを requirements.txt に定義しておきます

```docker
FROM python:3.8.3-slim
USER root

RUN apt-get update
RUN apt-get -y install locales && localedef -f UTF-8 -i ja_JP ja_JP.UTF-8

ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN apt-get install -y vim less
RUN apt-get install -y dnsutils iputils-ping net-tools procps netcat

COPY requirements.txt .
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip install -r requirements.txt

WORKDIR /opt/app
COPY ./opt/*.py /opt/app/.
```

```requirements.txt
faker
kafka-python
pika
```

### Docker イメージの作成

```
$ docker image build -t iotdatagen:5.0 .

$ docker images                            
REPOSITORY            TAG        IMAGE ID       CREATED          SIZE
iotdatagen            5.0        7f1f883907a5   33 seconds ago   322MB
```

---

## コンテナイメージのプッシュ

### ACRへのログイン

```
$ az acr login --name $ACR_NAME
Login Succeeded
```

### イメージをACRにプッシュ

```
$ docker tag iotdatagen:5.0 $ACR_LOGIN_SERVER/iotdatagen:5.0
$ docker push $ACR_LOGIN_SERVER/iotdatagen:5.0
```

### イメージ詳細の確認

```
$ az acr repository show --name $ACR_NAME --repository iotdatagen

{
  "changeableAttributes": {
    "deleteEnabled": true,
    "listEnabled": true,
    "readEnabled": true,
    "teleportEnabled": false,
    "writeEnabled": true
  },
  "createdTime": "2021-09-02T01:16:44.2425619Z",
  "imageName": "iotdatagen",
  "lastUpdateTime": "2021-09-02T01:16:44.3255467Z",
  "manifestCount": 1,
  "registry": "acr0ituru.azurecr.io",
  "tagCount": 1
}
```

### イメージタグの確認

```
az acr repository show-tags -n $ACR_NAME --repository iotdatagen --output table

Result
--------
5.0
```

### イメージ一覧の表示

```
$ az acr repository list --name $ACR_NAME --output table
```

### まとめ

これで、Pythonプログラムをコンテナ化し、ACRに登録できることを確認しました

---

## 付録

### イメージの削除

```
$ az acr repository delete --name $ACR_NAME --repository iotdatagen
Are you sure you want to delete the repository 'iotdatagen' and all images under it? (y/n): y
```

### レジストリ サイズの管理

```
$ az acr show-usage --resource-group $ACR_RES_GROUP --name $ACR_NAME --output table

NAME      LIMIT         CURRENT VALUE    UNIT
--------  ------------  ---------------  ------
Size      107374182400  3165990677       Bytes
Webhooks  10            0                Count
```