今回は、FlaskをDocker上で動作させて、HelloWorldを表示するメモとなります。
以下と近い内容となっています。今回はDocker Composeを利用します。
目次
Docker Composeを利用した理由
今回Docker Composeを利用する理由は、複数のコンテナを利用したい場合に対応しただけでなく、
以下の問題を解決できなかったので、Docker Composeを利用しました。
- デバッグ実行できない
- ソース修正後、サービスに反映させる場合、コンテナの作り直しが必要
故に、DockerとDocker Composeが動作可能な前提の内容となっています。
https://docs.docker.com/get-started/
https://docs.docker.jp/compose/toc.html
また、有償版のPyCharmを利用した内容になりますが(特にDockerの部分)、
無償版のPyCharmや他のIDEでも、
Docker Composeコマンドを実行頂ければ、再現できると思います。
JetBrains公式で紹介されている以下を参考にしています。
https://pleiades.io/help/pycharm/using-docker-as-a-remote-interpreter.html
環境
- macOS:Big Sur 11.5.2
- PyCharm:2022.2.2 (Professional Edition)
- Docker:20.10.12
- docker-compose version 1.29.2
事前準備
はじめにPyCharmのプロジェクトを作成する前に、4つのファイルを用意します。
4つのファイルは、後にPyCharmのプロジェクトのディレクトリとして指定する場所に配置します。
※事前に用意する理由は、後述の補足に記載しています。
・Dockerfile
FROM python:3.10.8-slim-buster
RUN pip install --upgrade pip
RUN pip install flask==2.2.2
ENV PORT 5000
WORKDIR /app
COPY ./app /app
CMD ["python", "app.py"]
・docker-compose.yml
version: "3.9"
services:
app:
build: .
ports:
- "5000:5000"
・app/app.py
import os
from flask import Flask
port = int(os.environ['PORT'])
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello World! Start Flask on Docker using Pycharm.'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
プロジェクト作成
事前にファイルを準備したら、PyCharmより新規プロジェクトを作成します。
Locationの部分は、事前にファイルを用意したディレクトリを指定して、Createボタンをクリックします。
Directory Is Not Empty の確認メッセージが表示されたら、
Open Projectをクリックします。
Create from Existing Sourcesでも良いですが、
今回は不要なPython実行用のenvフォルダが生成されます。
以下の様にプロジェクトが作成されます。
[参考]
DockerHub:https://hub.docker.com/_/python
Flask:https://flask.palletsprojects.com/en/2.2.x/changes/
Current Interpreter設定・Docker Compose設定
次に、Pythonの実行を担うInterpreterの設定と、Docker Composeの設定を行います。
(Interpreterの設定時にDocker Composeの設定も必要となるため、同時に行います)
こちらの設定は、Docker Composeを実行可能な状態で行ってください。
まず、画面下部のCurrent Interpreter(プロジェクト生成時に指定したPython実行名が
表示されている場合もあります)をクリックします。
その後、Add New Interpreter -> On Docker Compose… をクリックします。
New Target: Docker Composeが表示されたら、以下の内容で指定します。
Server:接続済みのDocker設定
Configuration files:事前に用意済みのdocker-compose.yml
Service:docker-compose.ymlで設定しているServiceのapp
尚、Docker設定が存在しない場合、以下の様に設定を行ってからServiceを指定します。
+プラスマークをクリックします。
Nameに任意の識別名称を入力し、Connect to Docker daemon with の部分を指定します。
私の場合、Docker for Mac を利用しているのでそのままOKボタンをクリックしました。
※OKを押す前に、Dockerが動いていないとエラーになります。
それぞれ指定してNextボタンをクリックすると、コンテナのビルドが行われます。
正常にFinishしたら、更にNextボタンをクリックします。
そして、Python実行のInterpreter設定が表示されたら、
実行に利用したいPythonを指定します。
時に理由が無ければ、そのままでCreateボタンをクリックします。
正常に登録されて設定されれば、右下のCurrent Interpreterの表示が変わります。
Docker Compose 起動 動作確認
プロジェクトが開けて、Current Interpreterの設定も済んだら、
Dockerコンテナを起動して動作確認を行います。
まず、画面下部のServicesの部分を開きます。
先ほど登録したDockerの名称が表示されていますので、
そちらを選択し、右クリックメニューのDeployをクリックします。
Deploy Configurationでは、Create Docker-compose Deployment…をクリックします。
Create Docker-compose Deploymentが開いたら、
Nameを任意の識別名称で指定します。
Serverは、先ほど設定したDockerの設定のままにしておきます。
Compose filesは、事前に用意したdocker-compose.ymlを指定します。
Compose filesも指定できたら、Runボタンをクリックして起動します。
正常に起動すると、Serviceに表示され、Log出力されます。
Logに出力されているエンドポイントにアクセスして、
app.pyの戻り値が表示されれば正常に動作しています。
右クリックで、Stop Containerで停止できます。(コンテナ・イメージの削除は行われません)
デバッグ確認
今度は試しに、ステップ実行を行えるか確認します。
デバッグ実行を実施する際に、コンテナも自動的に起動するため、
コンテナとサービスが停止している状態で行います。
(既に動作している場合、起動に失敗します)
実行したいPythonファイルのmain関数部分より、デバッグ実行ボタンをクリックします。
自動的にコンテナが立ち上がり、
サービスが起動してDebugの部分にログが出力されます。
先ほどと同様のエンドポイントにアクセスします。
ブレークポイントで停止し、ステップ実行できた場合、デバッグ実行も正常に動作しています。
停止ボタンをクリックすると、サービスとコンテナが自動停止します。
補足 PyCharm Interpreter エラー
手元で確認している際に、Current Interpreterの設定が上手くいかない現象を確認しました。
内容をメモしておこうと思います。
PyCharmでプロジェクトを新規作成する際に、Current Interpreterの設定を同時に行うと、
以下のエラーメッセージが表示され、プロジェクトを生成出来ませんでした。
This interpreter type does not support remote project creation
色々と試してみましたが解消できず、
プロジェクトを生成した後に、Current Interpreterを設定すると上手くいきました。
今回のメモは以上となります。
動作させるコンテナが1つの場合、
なるべく、docker-composeは利用せず、Dockerのみで動作させたいですが、
デバッグ実行、ソースの即時反映が行われないと不便ですので、
参考に頂ければと思います。