VSCodeリモートコンテナでFlask環境を簡単に構築する方法

# 1. 目的
この記事の目的は、VSCodeのリモートコンテナでFlask環境を構築し、楽に開発を行えるようにすることです。

# 2. 事前準備
必要な事前準備は以下のようになります。

## 2-1. VSCodeと拡張機能のインストール
以下のページを参考に、VSCodeと拡張機能をインストールしてください。

https://code.visualstudio.com

必要な拡張機能
* [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)

## 2-2. Docker Desktopのインストール
以下のページを参考にDocker Desktopをインストールしてください。

* [Macの方](https://docs.docker.com/desktop/install/mac-install/)
* [Windowsの方](https://docs.docker.com/desktop/install/windows-install/)
* [Linuxの方](https://docs.docker.com/desktop/install/linux-install/)


# 3. ディレクトリとファイルの作成
以下では、VSCodeのリモートコンテナでFlask環境を構築するために必要なディレクトリ、ファイルを作成します。

私のGitHubで、今回作成するファイルを公開しています。もしよろしければ参考にしてください。

https://github.com/Mochi-Moch1/vscode-remote-container-flask

cloneで複製していただいても大丈夫です。
```
$ git clone https://github.com/Mochi-Moch1/vscode-remote-container-flask.git
```


## 3-1. ディレクトリの作成
以下のようなディレクトリ構造を作成していきます。
親となるディレクトリ(vscode-remote-container-flask)は好きな場所に作っていただいて大丈夫です。
```
vscode-remote-container-flask
┝ .devcontainer 
│   └ devcontainer.json
┝ Dockerfile
┝ docker-compose.yml
┝ app.py
```

## 3-2. devcontainer.json ファイルの作成
.devcontainer の中に以下のようなファイルを作成します。
```json
{
	"name": "flask-python3",
    "dockerComposeFile": "../docker-compose.yml",
    "service": "python3", 
	"workspaceFolder": "/app",
    "shutdownAction": "stopCompose",
    "extensions": ["ms-python.python"]
}
```
各項目を説明します。
1. `"name": "flask-python3"`
    * 今回作るコンテナの名前です。


2. `"dockerComposeFile": "../docker-compose.yml"`
    * 参照するDocker Composeファイルへのパスを示します。パスは``devcontainer.json``からの相対パスで与えます。
    * Docker Composeを使う場合には必須です。


3. `"service": "python3"`
    * `devcontainer.json`で扱うDocker Compose内のサービスを与えます。
    * 基本は1つの`devcontainer.json`で一つのサービスを扱います。
    * Docker Composeを使う場合には必須です。

4. `"workspaceFolder": "/app"`
    * リモートコンテナに接続したときにデフォルトで開く、ファイルのパスを与えます。

5. `"shutdownAction": "stopCompose"`
    * リモートコンテナのウィンドウを閉じた時の処理を与えます。
    * `stopCompose`では、composeごと停止します。
6. `"extensions": ["ms-python.python"]`
    * リモートコンテナ内でダウンロードしたいVSCodeの拡張機能を与えます。
    * ローカルコンピュータのVSCodeの拡張機能には、影響を与えません。

## 3-3. Dockerfileの作成
以下に今回作成するコンテナのDockerfileを示します。

```dockerfile
FROM python:3.10

RUN python -m pip install --upgrade pip

RUN pip install --no-cache-dir Flask 

WORKDIR /app

COPY ./app.py /app
```
各項目を説明します。

1. `FROM python:3.10`
    * コンテナの元となるimageを指定します


2. `RUN python -m pip install --upgrade pip`
    * pipのインストールとアップデートを行います


3. `RUN pip install --no-cache-dir Flask `
    * Flaskのインストールを行います


4. `WORKDIR /app`
    * Dockerfileが扱う作業ディレクトリを`/app`に移動します


5. `COPY ./app.py /app`
    * `app.py`をコンテナ内の`/app`の下にコピーします。


## 3-4. app.pyの作成
次にflaskのアプリケーションを実行するファイルを作成します。
```python
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, Remote Flask!'
```
内容は、'Hello, Remote Flask!'と表示するものです。

## 3-5. docker-compose.ymlの作成

```yml
version: '3'
services:
  python3:
    build:
      context: .
      dockerfile: Dockerfile
    tty: true
    volumes:
    - app:/app
    ports:
      - '5001:80'

volumes:
  app:
```
各項目を説明します。

1. `version: '3'`
    * Compose fileのバージョンを与えます


2. services:
  python3:
    * python3という名前のサービスを作成します
        * サービスは一つのコンテナのようなイメージです

1. build:
      context: .
      dockerfile: Dockerfile
    
    * コンテナを作成するためのDockerfileへのパスを指定します

1. `tty: true`
    * コンテナ側に仮想端末を置くことで、コンテナを正常終了させず、持続させます

1.  volumes:
    -app:/app
    * appという名前のvolumeに場所`/app`を与えます
        * volumeはデータを保存しておく場所のようなイメージです
        * ウィンドウを閉じてもデータが保持されます

1.   ports:
     -'5001:80'
    * ポートを指定します
        * 左(5001)はホストのポート
        * 右(80)はコンテナのポート

1. volumes:
  app:
    * 先ほど指定したvolumeのappを再度指定します
        * volumeに名前をつけるために必要です
            * 名前をつけるとvolumeの管理が楽になります


# 4. リモート環境を組み立てる
いよいよVSCodeリモートコンテナを利用して、環境を立ち上げていきます！
## 4-1. フォルダをコンテナで開ける
1. VSCodeで先ほど作成したフォルダ`vscode-remote-container-flask`を開いてください。

2. 左下の緑の部分をクリックしてください

3. Open Folder in Container をクリックしてください

4. Openでフォルダ`vscode-remote-container-flask`を開いてください

![スクリーンショット 2022-09-11 18.21.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900476/c0613f12-3790-b360-73f5-162f80847782.png)

### エラーが出た場合

* ポートに関するエラーが出た場合は、一度作成されたリモートコンテナを削除し、docker-compose.yml内のポート番号(5001)を5002などに変更してください。

* 修正してうまくいかない場合などは、F1キーを押して`Remote Containers : Rebuild and Reopen in Container`を試してみてください。

## 4-2. アプリを実行と結果の確認

app.pyの内容を実行するため、以下のコマンドをVSCodeリモートコンテナ内のターミナルに入力してください。

```
python3 -m flask run -p 80 -h 0.0.0.0
```

実行結果を確認するため、
* ` * Running on http://127.0.0.1:80`の`http://127.0.0.1:80`をcommand または ctrlを押しながらクリックしてください

または
* ブラウザで`localhost:5001`と検索してください。
    * 5001の部分は、docker-compose.ymlのポート番号（左側）に対応した数字を入れてください。


成功していれば、以下のような画面になります。
![スクリーンショット 2022-08-24 19.55.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900476/57608367-896d-5ac0-2b21-5004d07e1a8c.png)

以上でFlaskの環境構築は終了です！お疲れ様でした！
快適なコーディングの手助けになれば嬉しいです。

# 参考文献
以下のものを参考にさせていただきました。

https://containers.dev/implementors/json_reference/

https://docs.docker.com/engine/reference/builder/#run

https://docs.docker.com/compose/compose-file/compose-file-v3/

https://docs.docker.com/language/python/build-images/

https://gray-code.com/blog/flask-on-docker/

https://zenn.dev/yuchiki/articles/vscode-remote-container

https://qiita.com/gounx2/items/23b0dc8b8b95cc629f32

#### 読んでいただき、ありがとうございました！