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]

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

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

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

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

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

いざ新規プロジェクトを作成・・・できない。

[New Project]を選択

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

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

原因を探る

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

まずはサポートページから見てみると、どうやら同じ現象のようです。

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

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

次にYouTrack。これも2017年ですね・・・。

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

うまく行った方法

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

参考にしたURL

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

Docker-Compose: Getting Flask up and running

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

flask-docker
├── Dockerfile
├── docker-compose.yml
├── main.py
└── requirements.txt
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
docker-compose.yml
version: '2'
services:
  web:
    build: .
    ports:
    - "5000:5000"
requirements.txt
Flask==1.1.1

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

PyCharmでOpen + Docker Composeの設定

PyCharm起動画面で[Open]→作成したフォルダを選択します。

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

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

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

ソースコードの作成

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の場合)

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)
ターミナルでcurlからアクセス
$ curl localhost:5000
Hello!

やったね!!