つまりどういうことだってばよ?
はい。何を言ってるか分かりづらいですね。
ということで図解してみます。
まず現状の開発環境が次のような環境とします。
docker-compose up -d
をすることで下記のコンテナが起動。
- Nginx
- forntend
- backend
- DB
それぞれのコンテナは docker のネットワークにつながっているので通信可能。
frontend と backend は host 側のソースファイルのディレクトリをマウントして動いている感じです。
まぁ、よくある構成かと思います。
これに backend 開発用のコンテナを追加し、そこで開発をする。というのが今回の目的です。
既存の backend を使ってもいいのですが、まぁせっかくなので別々にして環境をスッキリさせた方が良いのでは!という感じですね。
要約すると
- 開発用のコンテナを作る
- vscode からコンテナに attach
- Let's 開発!
ということで
お試しの環境には FastAPI が提供している "Full Stack FastAPI PostgreSQL" テンプレートを使用します。
ただ、本記事執筆の段階ではメンテが止まっていて手を入れないと動きません。
そちらについては下記の記事をご参照ください。
で、 docker-compose up -d
でコンテナ群を起動します。
$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------------------------------
full-stack-fastapi- /start-reload.sh Up 80/tcp, 0.0.0.0:8888->8888/tcp,::
postgresql_backend_1 :8888->8888/tcp
full-stack-fastapi- bash /worker-start.sh Up
postgresql_celeryworker_1
full-stack-fastapi- docker-entrypoint.sh postgres Up 5432/tcp
postgresql_db_1
full-stack-fastapi- flower --broker=amqp://gue ... Up 0.0.0.0:5555->5555/tcp,:::5555->5
postgresql_flower_1 555/tcp
full-stack-fastapi- nginx -g daemon off; Up 80/tcp
postgresql_frontend_1
full-stack-fastapi- /entrypoint.sh Up 443/tcp, 0.0.0.0:5050->5050/tcp,:
postgresql_pgadmin_1 ::5050->5050/tcp, 80/tcp
full-stack-fastapi- /entrypoint.sh --providers ... Up 0.0.0.0:80->80/tcp,:::80->80/tcp,
postgresql_proxy_1 0.0.0.0:8090->8080/tcp,:::8090->8
080/tcp
full-stack-fastapi- docker-entrypoint.sh rabbi ... Up 15691/tcp, 15692/tcp, 25672/tcp,
postgresql_queue_1 4369/tcp, 5671/tcp, 5672/tcp
まずはここに開発用のコンテナを追加します。
名前をつけて run する感じですね。
fastapi-backend-dev
の部分をよしなに書き換えてください。
docker-compose run --name fastapi-backend-dev backend
で、コンテナを起動させたら止めましょう。
次に vscode のリモートエクスプローラーから作ったコンテナに attach します。
リモートエクスプローラーを見ると先ほど作成したコンテナの名前があるはずです。
(vscode の拡張機能については割愛します。この辺をご参照です)
コンテナがあったら 右クリック -> Attach in New Window
などでコンテナに attach します。
attach したら作業ディレクトリを開きましょう。
"Full Stack FastAPI PostgreSQL" テンプレートを使用しているのであれば /app
が作業ディレクトリになるはずです。
あとは通常の開発と同じ、、、なはず。
pytest で debug してみる
vscode から pytest で debug してましょう。
まず事前情報です。
"Full Stack FastAPI PostgreSQL" テンプレートの backend の環境では python 3.9 と 3.7 が共存していました。
backend.dockerfile
に記載がありますが、環境としては 3.7 が正となるようなので vscode で参照する python を 3.7 にします。
あとはよしなにですね。
app/tests/crud/test_item.py
など開いて pytest から debug しましょう。
lint したり保存と同時にフォーマットしたり
lint したり保存と同時にフォーマットできるようにしてみます。
まず、次の拡張機能を追加しましょう。
- ms-python.black-formatter
- ms-python.isort
次に .vscode/settings.json
に追記します。
{
+ "editor.formatOnSave": true,
+ "python.linting.enabled": true,
+ "python.linting.flake8Enabled": true,
+ "python.linting.mypyEnabled": true,
+ "[python]": {
+ "editor.defaultFormatter": "ms-python.black-formatter",
+ "editor.codeActionsOnSave": {
+ "source.organizeImports": true
+ },
+ },
+ "black-formatter.args": [
+ "--config",
+ "pyproject.toml"
+ ],
+ "isort.args": [
+ "--settings-file",
+ "pyproject.toml"
+ ],
}
としておくと。。
gif では分かりづらいですが =
の箇所にスペースを大量に入れた後に保存しています。
結果として最初に状態に戻っている、というわけです。
素晴ら!
ただし、ホスト側に .vscode/settings.json
が追加されますので誤ってコミットしないように ignore するようにしておきましょう。
欠点
欠点としては、コンテナを作り直すと vscode の拡張機能などがリセットされますので再度インストールが必要です。
devcontainer.json を使えば、この辺を自動化できるのかなぁ。。。
以上です!お疲れさまでした!