【Docker】Terraform+Azure CLI+DooD環境を構築

TerraformとDooD環境にAWS CLIを使用できるコンテナは、以下の記事で紹介しました。
[【Docker】Terraform+AWS CLI+DooD環境を構築](https://qiita.com/Shoma0210/items/7178284e4fdbcd5f9dc2)

今回はそれを応用して、Azure CLIを使用できるコンテナを作成しようと思います。
また、コンテナのベースイメージはAlpine Linuxですので、Dockerfileに記載するコマンドは、Azure CLIをAlpine Linuxにインストールしたい方にも参考になると思います。

# ターゲット

- Azure CLI環境をコンテナ化したい
- Alpine LinuxにAzure CLIをインストールしたい

# Azure CLIを使う方法

## 公式イメージを使う

Azure CLIのみを使用したい場合は、公式ドキュメントの[Docker コンテナーで Azure CLI を実行する方法](https://docs.microsoft.com/ja-jp/cli/azure/run-azure-cli-docker)の手順で、公式イメージの`mcr.microsoft.com/azure-cli`を使用するのが一番簡単です。

```bash
docker run -it mcr.microsoft.com/azure-cli
```

ホスト環境のSSHキーを使う場合は、マウントします。
環境変数HOMEが`.ssh`ディレクトリのパスの想定です。

```bash
docker run -it -v ${HOME}/.ssh:/root/.ssh mcr.microsoft.com/azure-cli
```

## Alpine Linuxにインストールして使う

今回はベースイメージとして後述するTerraformの公式イメージを使います。Terraformの公式イメージはAlpine Linuxですので、その場合は以下のように作成します。

```Dockerfile:Dockerfile
FROM alpine:latest

# install Azure CLI
RUN apk add py3-pip && \
apk add gcc musl-dev python3-dev libffi-dev openssl-dev cargo make && \
pip install --upgrade pip && \
pip install azure-cli
```

環境変数HOMEに`.ssh`があるフォルダパスを設定します。

```bash:例 | Windowsの場合
set HOME=C:/Users/<username>
```

コンテナイメージをビルドして、実行します。

```bash
docker build -t azure-cli/alpine .
docker run -it -v ${HOME}/.ssh:/root/.ssh azure-cli/alpine
```

# Terraform+Azure CLI+DooDをする

## 必要ファイルの準備

```bash:フォルダ構成
└─tf-azurecli
        .env
        docker-compose.yml
        Dockerfile
```

Terraformが使用できる公式イメージ(OSはAlpine Linux)をベースに、Docker CLIとAzure CLIをインストールします。
Dockerfileを作成するとこのようになります。

```Dockerfile:Dockerfile
FROM hashicorp/terraform:latest

# install Docker CLI
RUN apk update && \
apk add --no-cache docker-cli && \
apk add --no-cache docker-compose

# install Azure CLI
RUN apk add py3-pip && \
apk add gcc musl-dev python3-dev libffi-dev openssl-dev cargo make && \
pip install --upgrade pip && \
pip install azure-cli
```

`.ssh`をマウントする設定を`docker-compose.yml`にまとめます。
また、DooDのために`volumes`で`/var/run/docker.sock`をマウントします。

```yml:docker-compose.yml
version: '3'
services:
  tf-azurecli:
    container_name: tf-azurecli
    build: .
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ${HOME}/.ssh:/root/.ssh
    entrypoint: ash
    tty: true
```

また、`.ssh`をマウントするときに使用する環境変数を`.env`で設定します。

例) Windowsユーザー場合

```text:.env
HOME=C:/Users/<username>
```

## 使ってみる

コンテナを立ち上げてみましょう。

```bash
docker-compose build --no-cache
docker-compose up -d
docker-compose exec tf-azurecli /bin/ash
```

execで中に入れたら、各ツールが使えるか確かめましょう。
例としてバージョンを確認してみます。

```bash:Terraformバージョン確認
terraform -v
Terraform v1.2.1
on linux_amd64
```

```bash:Dockerバージョン確認
docker -v
Docker version 20.10.16, build aa7e414fdcb23a66e8fabbef0a560ef1769eace5
```

```bash:AWSCLIバージョン確認
az -v
azure-cli                         2.37.0
・・・中略・・・
and let us know if you're interested in trying out our newest features: https://aka.ms/CLIUXstudy
```

# さいごに

前回のAWS CLIに続いて、TerraformとAzure CLI環境をコンテナ化してみました。
コンテナに慣れてしまうと、依存関係で悩まされることが少なくなるのがいいですね。

# 参考

[Install Azure CLI on Alpine Linux #19591](https://github.com/Azure/azure-cli/issues/19591)
[【Docker】Terraform+AWS CLI+DooD環境を構築](https://qiita.com/Shoma0210/items/7178284e4fdbcd5f9dc2)