Docker で Azure CLI をはじめる

公開:2021/01/26
更新:2021/01/26
4 min読了の目安(約3600字TECH技術記事

この記事について

Microsoft Azure で開発や検証をする際、コマンドラインインターフェース (CLI) として Azure CLI を使う機会は多いと思います。
ただ、通常だと、Azure CLI は Windows や macOS に直接インストールして使うことになるので、ホスト OS を汚したくない、Docker 大好きな私にとっては、ホスト OS に Azure CLI をインストールすること自体にかなり抵抗がありました。

Azure CLI は、Docker コンテナー上で動作させることも可能であり、Microsoft 社が公式に Docker イメージを提供していたりします。
そのため、今回は公式に提供されている Docker イメージを使用して、Docker コンテナー上で Azure CLI を動かすことをやっていこうと思います。
コンテナー環境については、Docker Compose を使用してコード管理できるようにします。

Docker Hub

公式の Docker イメージは、以下のサイトで公開されています。

Azure CLI on Docker の作成

以下のような docker-compose.yaml を準備して、docker-compose up -d をするだけで、Azure CLI が実行可能な Docker コンテナーを用意できます。

docker-compose.yaml
version: '3'

services:
  azurecli:
    image: mcr.microsoft.com/azure-cli:latest
    container_name: azure-cli
    tty: true
    volumes:
      - ${HOME}/.ssh:/root/.ssh
      - ./scripts:/home
    working_dir: "/home"
docker-compose up -d

コマンドを実行したら、コンテナーの起動状況を確認します。StateUp になっていれば OK です。

docker-compose ps
      Name                     Command               State           Ports         
-----------------------------------------------------------------------------------
azure-cli           /bin/sh -c bash                  Up                            

Azure CLI の起動

コンテナーが起動したら、コンテナーの中から Azure CLI を起動します。

コンテナーの中に入って操作を行いたい場合

docker ps を実行して、コンテナー ID を取得した後、Docker コンテナーの中に入ります。

docker ps
CONTAINER ID   IMAGE                                COMMAND                  CREATED       STATUS       PORTS                    NAMES
cf2ad69525f5   mcr.microsoft.com/azure-cli:latest   "/bin/sh -c bash"        4 hours ago   Up 4 hours                            azure-cli

この例でいうと、cf2ad69525f5 が Azure CLI が入っている Docker コンテナーの ID になるため、この ID を使用してコンテナーの中に入ります。

docker exec -it cf2ad69525f5 "bash"

ここで、通常であれば、Microsoft Docs などでよく見る az login コマンドを実行して Azure にログインするわけですが、1 点注意したいのは、Docker コンテナー内には Web ブラウザーがないということです。
Azure CLI はこの点も考慮されており、ブラウザーが開けない場合は、リモートログインができるように設計されています。

az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code HKH7D6WXV to authenticate.

このような表示が出るので、記載の URL にホスト OS 側にある Web ブラウザーなどでアクセスし、認証コードを入れた上で、リモートログインを実施することができるようになっています。
これは、az login--use-device-code オプションの動作になります。

az login -u <username> -p <password> でもログインできます。こちらはリモートログインではなく、コマンドライン上でそのままログイン処理を行えます。

サインイン方法の詳細については、以下の Microsoft Docs 記事を参照してください。

ログインができたら、あとは他と同じように利用できます。

Docker コンテナーの外から操作を行いたい場合

Azure リソースをセットアップするためのスクリプトを組んでいる時などは、外から docker-compose run を使用してコマンド実行することも可能です。
./scripts フォルダ以下に任意のスクリプトを配置して、以下のコマンドを実行することで、Docker コンテナー内でスクリプトを起動できます。

docker-compose run --rm azurecli <hogehoge.sh>

実際にスクリプトの実行が完了すると、コンテナー内は初期化されるため、永続化したいファイルなどは、docker-compose.yaml 内の volumes にて、追加でディレクトリの設定を行うといいと思います。

まとめ

CLI も今や Docker で動かせる時代になりました。ホスト OS にいろんなものを直接インストールしているが故に、ソフトウェア間の依存関係に悩まされてしまうことは多々ありますが、それらの多くは時間の無駄に直結しています。
特に CLI というものは、他のツールなどに比べると、アップデートやダウングレードなどのバージョン管理が面倒だったり、バージョン更新によって動作がおかしくなったりすることが発生しやすいものでもあると思います。
その点、Azure CLI を Docker コンテナー上で動かすようにしてしまえば、集団での開発作業などでも実行環境の統一ができ、最新バージョンにアップデートする時もコンテナーを pull しなおすだけで OK になります。
この機会に、CLI も Docker で動かす習慣をつけてみるといいと思います。

参考情報

Microsoft Docs