PyCharmでDocker上のPythonを使ってプロジェクトを作成しようとしたらダメだったけど、Docker Composeでうまくいった

# やりたいこと
PyCharmでPythonプログラムを実行する際、ローカルPCにインストールしたPythonではなく、Docker内のコンテナで実行したい。具体的には、FlaskによるWebアプリをPyCharmからDockerで実行したい。

環境はこちら。

- macOS Catalina 10.15.6
- PyCharm 2020.2.2 Professional Edition
- Docker for Mac 2.3.0.5

> この機能は、PyCharm Community Editionでは利用できません。

# 3行で書くと
- PyCharmから[New Project]で新規プロジェクトを作成するとうまくできません
- フォルダやファイルを作成してから、PyCharmで[Open]しましょう
- DockerではなくDocker Composeを使いましょう

# うまく行かなかった方法
## まずPyCharmに設定してみた
PyCharmを起動して[Configure]-[Preference]

![スクリーンショット 2020-09-25 11.11.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/7dc8d252-3e24-fe66-224d-bafee0e9e3a3.png)

[Python Interpreter]を選択して、画面右端にある歯車アイコンをクリック→[Add...]

![スクリーンショット 2020-09-25 11.11.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/231b8a63-2b29-e5c5-64b5-f3142ba69135.png)

[Docker]を選択→[Server]の[New]をクリック

![スクリーンショット 2020-09-25 11.15.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/56ccb13f-50f8-061b-14a6-6270a160d9af.png)

[Docker for Mac]を選択→画面下部に[Connection Successful]と表示されていることを確認してから[OK]

![スクリーンショット 2020-09-25 11.19.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/2a96e4f4-91b8-dc74-cb88-afadcf0b4873.png)

[Image name]に `python:3.8` 、[Python interpreter path]に `python` と入力→[OK]

![スクリーンショット 2020-09-25 11.21.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/612874b2-8364-93bf-236d-f2b1bd70dcd1.png)

[Python interpreter]が下記のようになっていることを確認→[OK]

## いざ新規プロジェクトを作成・・・できない。
[New Project]を選択

![スクリーンショット 2020-09-25 11.24.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/52e4b45a-4d5d-3159-26f7-103dbd0e88b6.png)

[Existing interpreter]を選択→[Interpreter]で作成したDocker内Pythonを選択

![スクリーンショット 2020-09-25 11.26.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/4719153a-4656-0c62-d6cb-6d0fcc0b6837.png)

[Remote path not provided]と言われるので、適当なパスを入力。すると「This interpreter type does not support remote project creation」などと言われてしまう。[Create]が押せない。

![スクリーンショット 2020-09-25 11.27.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/cbf5f7ed-f770-7c1c-8fd3-e624f0a11337.png)

## 原因を探る
とりあえずさっき出たエラーメッセージでググると、公式サポートページやYouTrack（JetBrainsのイシュートラッキングシステム）が出てくるので、見てみます。

![スクリーンショット 2020-09-25 11.29.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/41dbb504-e177-ca18-c933-16087e080c1f.png)

まずは[サポートページ](https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000636990-PyCharm-This-interpreter-type-does-not-support-remote-project-creation)から見てみると、どうやら同じ現象のようです。

回答には「システム上のPythonでプロジェクトを作って、設定からDocker上のインタープリターを追加してや！」と書いてあります。

しかしこのページ、2017年10月のものがそのままになってますね・・・。

次に[YouTrack](https://youtrack.jetbrains.com/issue/PY-24427?_ga=2.125642318.510142015.1600992327-1463313063.1600843195)。これも2017年ですね・・・。

この回答にも「Openでフォルダを開いてからインタープリターを設定したらできたよ！」と書いてあります。

# うまく行った方法
JetBrainsサポートページやYouTrackに書いてあった、フォルダやファイルなどを作成してからそれをPyCharmで開く作戦にします。

## 参考にしたURL
JetBrains公式ブログを参考にしました。（「Flask PyCharm Docker」で検索したらヒットした）

[Docker-Compose: Getting Flask up and running
](https://blog.jetbrains.com/pycharm/2017/03/docker-compose-getting-flask-up-and-running/)

## フォルダやファイルなどの作成

```
flask-docker
├── Dockerfile
├── docker-compose.yml
├── main.py
└── requirements.txt
```

```Dockerfile:Dockerfile
FROM python:3.8-alpine3.12

RUN mkdir /app
WORKDIR /app

COPY main.py main.py
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

EXPOSE 5000

CMD python main.py
```

```yaml:docker-compose.yml
version: '2'
services:
  web:
    build: .
    ports:
    - "5000:5000"
```

```txt:requirements.txt
Flask==1.1.1
```

> main.pyは後ほど作成します。

## PyCharmでOpen + Docker Composeの設定
PyCharm起動画面で[Open]→作成したフォルダを選択します。

Preference→[Project: (プロジェクト名)]-[Python interpreter]→画面右側の歯車アイコンをクリック

![スクリーンショット 2020-09-25 14.04.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/9a0c310b-420b-a08d-b7b6-21f15ee69cb4.png)

[Docker Compose]を選択→[Server]で[Docker]（前の手順で作成したもの）、[Configuration file(s)]でプロジェクト内のdocker-compose.yml、[Service]で[web]を選択→[OK]

![スクリーンショット 2020-09-25 14.04.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/56f7eddd-39b8-d327-cbe8-cce98b90b019.png)

Flaskなど、requirements.txtに書いたライブラリが含まれていることを確認して[OK]

![スクリーンショット 2020-09-25 14.07.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/1f575548-ff21-0596-0bb2-471ebcc49007.png)

## ソースコードの作成

```python:main.py
from flask import *

app = Flask(__name__)


@app.route('/')
def hello():
    return "Hello!"


if __name__ == '__main__':
    app.run(host='0.0.0.0', port='5000')
```

Flask関連のものも、PyCharm上で補完が効きます！！！

> Docker ComposeではなくDockerにした場合、PyCharm上での補完が効きません。おそらく、Dockerの場合は `docker run` コマンドで実行しているっぽいので、Dockerfileが使われないのだと思います。

## 実行
main.py上で右クリック→[Run]またはCtrl+Shift+R（Macの場合）

```bash:PyCharmのコンソール
/usr/local/bin/docker-compose -f /Users/tada/IdeaProjects/flask-docker/docker-compose.yml -f /Users/tada/Library/Caches/JetBrains/PyCharm2020.2/tmp/docker-compose.override.272.yml up --exit-code-from web --abort-on-container-exit web
Recreating flask-docker_web_1 ... 
Attaching to flask-docker_web_1
web_1  |  * Serving Flask app "main" (lazy loading)
web_1  |  * Environment: production
web_1  |    WARNING: This is a development server. Do not use it in a production deployment.
web_1  |    Use a production WSGI server instead.
web_1  |  * Debug mode: off
web_1  |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
```

```bash:ターミナルでcurlからアクセス
$ curl localhost:5000
Hello!
```

やったね！！