VSCode の Remote Container で Azure Functions + Python 開発環境を構築する

特に難しいところはありませんが /workspace にプロジェクトを作らない構成にしています。

# Dockerfile 

Dockerfile は Python3.9ベースです。 Azure Functions Core Tools の3系をインストールするために Node.js と npm を先にインストールしています。
特に意味はありませんが、 yarn もインストールしています。不要なら yarn の文字を削除してください。

```Dockerfile:Dockerfile
FROM python:3.9-bullseye

RUN apt-get update && apt-get install -y \
    nodejs \
    npm

RUN npm install -g yarn @anthonychu/funcvm && funcvm use 3

ENTRYPOINT tail -f /dev/null
```

# docker-compose.yml

Remote Container の 既定では /workspace に対して Bind Mount する（ホストと同期する）設定になっていて、そこにプロジェクトを作ることを暗に促されますが、パフォーマンスがすごく悪いのでプロジェクトは /home 配下にディレクトリを作ってそこに作成することにします。個人的な趣味です。

docker-compose.yml にて /home 配下に作成するプロジェクトを永続化するために Volume を home という名前で作成しています。
/workspace の Bind Mount 設定はホストとのファイルをやり取りするために特に変更しません。


```yaml:docker-compose.yml
version: '3.8'
services:
  python:
    build: .
    ports:
      - 7071:7071
    volumes:
      - .:/workspace:cached
      - home:/home
volumes:
  home:
```

# devcontainer.json

手動で作る必要なんてありません。上記2つのファイルを同階層に置き、そのフォルダを VSCode で開いて画面左下の Remote Container のアイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222127/37cd3834-6f63-9ee7-53ec-1f7095ec0d59.png)

Add Development Container Configuration Files...を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222127/42b8e95f-1f85-86da-b0f7-c0e17858f0eb.png)

From 'docker-compose.yml' を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222127/a170a397-9a8f-4c0f-5752-2f6ab3a48eeb.png)

devcontainer.json ファイルが自動的に生成されます。このファイルの "workspaceFolder" の値を次のように編集します。この編集は必須ではありませんが、これで Remote Container に接続時に開く既定のディレクトリは /home になります。

```json:devcontainer.json
	"workspaceFolder": "/home",
```

devcontainer.json に VSCode のプラグインを Remote 先で使用するように二つ設定します。
画面左のプラグインアイコンをクリックし、 Python を検索したら Python プラグインを右クリックし、Add to devcontainer.json を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222127/b3768a10-edce-8630-a063-f53fb480671d.png)

devcontainer.json に次のようにプラグイン設定が反映されます。

```json:devcontainer.json
	"extensions": [
		"ms-python.python"
	]
```

同じようにして、 Azure Functions プラグインを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222127/ce8ab850-e7de-5757-3788-0a9119803d79.png)

```json:devcontainer.json
	"extensions": [
		"ms-python.python",
		"ms-azuretools.vscode-azurefunctions"
	]
```

準備完了です。Remote Container へ接続します。画面左下の Remote Container のアイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222127/37cd3834-6f63-9ee7-53ec-1f7095ec0d59.png)

Reopen in Container を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222127/2d3a481b-7b9c-d26b-8ea4-b2fc5af8066c.png)

無事に接続したら、Azure Functions を Python で作れることを確認してみてください。デバッグ実行も問題なくできるはずです。

https://docs.microsoft.com/ja-jp/azure/azure-functions/create-first-function-vs-code-python

# 後始末

作成した Container と Image を削除します。また docker 管理の Volume も作成されているので削除が必要です。

```bash
docker volume rm <VOLUME NAME>
```

Container との紐づけがもう無くなってしまった幽霊 Volume は prune コマンドでまとめて削除できます。

```bash
docker volume prune
```

# ソース管理について

/home 配下にプロジェクトを作成するようにしたのは /workspace 配下にプロジェクトを作るよりも圧倒的にパフォーマンスが良いからです。ソースをホストから見ることはできませんが、GitHub などの Git リポジトリに Push する運用が昨今は主流だと思いますので特に問題はないと思います。

ホストと同期する /workspace 配下にプロジェクトを作ればソースファイルをホストから修正することもできますが、もしかしたら起こるかもしれない程度の頻度のホストからのソースファイルを修正のために、普段の開発時のパフォーマンスの極度の劣化を受け入れることなど考えられません。

どうしてもそのような状況が起こった場合は、 GitHub などの Git リポジトリから Clone すればいいのです。そもそも、ホスト環境で開発できるようになっていなければホストからソースを修正するなど恐ろしくてできないはずです。そしてホストでソースを修正できる環境が整っているのであれば、Remote Container など不要です。