nginx-unitで作ったAPサーバ上でResponderが動くDocker環境を作る
サーバは動くようになったのでここからResponderが動くように変更する。 合わせてpipenvを使ったライブラリ管理も始めた
できたもの
- nginx-unitで作ったAPサーバでResponderが動くDockerコンテナが起動できる
各種ファイル解説
差分コミットはここ >
feat: responder追加 · teru0rc4/timer_app@deb47d3 · GitHub
Dockerfile
RUN pip3 install pipenv && \
pipenv install --system --ignore-pipfile
pipenv
を利用したパッケージ管理を導入するため、pipenvをインストールしました。
installするときには、dockerコンテナ内のPython環境を利用するため--system
をつけ、
勝手にlockファイルのみ参照し、かつpipfile、lockファイルを更新しなように--ignore-pipfile
をつけています。
また、このままだと依存関係が古くなったときに気づけないため、--deploy
もつけます。
似た挙動としてはpipenv sync
があります。
がこちらはpipenvの環境にインストールしてしまうので、今回の用途である「dockerコンテナ内の環境のPythonを使う」とは一致しないため採用していません。
COPY . .
また既存の設定だと、pipfileがうまくコピーされていないことに気がついたので、COPYのパスを変更しています。
pipfile
pipenv install responder
をしただけです。
特に追加の記述はなし。
wsgy.py -> asgi.py
responderになったので、ファイルをまるっと更新しました。
動かすコードはNGINX UnitのResponderサンプルのコードまんまです。
import responder app = responder.API() @app.route("/") def hello_world(req, resp): resp.text = "Hello, World!" @app.route("/hello/{who}") def hello_to(req, resp, *, who): resp.text = f"Hello, {who}!"
config.json
大事な箇所は、
"python": { "type": "python", "path": "/usr/src/app/src/", "module": "asgi", "callable": "app" }
対象のファイル名が変わったので、 "module": "asgi"
を指定、
その中のappを動かすために、asgi.py
のapp = responder.API()
の記述に合わせて、"callable": "app"を指定するのが必須です。
オプションの詳細な説明はこちら。
動かし方
前回と同じく下で起動できます
docker-compose build --no-cache docker-compose up -d
コンテナ内に入るときは
docker-compose exec timer_app bash
今回は簡単とは言えルーティングを実装しているのでその確認をしました。
ちゃんとコード通り動いてくれています。
参考
公式ドキュメント。 これをどうやって動かすかを中心に思案しました。
ライブラリとしてResponderを入れるにあったってどうやって管理するといいのかなということで参考にした所。
これを見つけるまではdockerのPythonとpipenvで作成してしまったPythonの二重環境になってしまっていたので、--system
使えばいけそうだけどなんでなんだろうなーっていう理由がしっかり書いてあったので助けられました。