しゃちの備忘録

プログラミングを中心とした技術関連の備忘録です(今のところ)

nginx-unitで作ったAPサーバ上でResponderが動くDocker環境を作る

前回 teru0rc4.hatenablog.com

サーバは動くようになったのでここからResponderが動くように変更する。 合わせてpipenvを使ったライブラリ管理も始めた

できたもの

  • nginx-unitで作ったAPサーバでResponderが動くDockerコンテナが起動できる
    • curlでリクエストを送ってレスポンスが返ってくる
    • 簡単なルーティングをResoponderで実装
    • ついでにpipenvでのパッケージ管理を開始

github.com

各種ファイル解説

差分コミットはここ >

feat: responder追加 · teru0rc4/timer_app@deb47d3 · GitHub

Dockerfile

f:id:teru0rc4:20210206121449p:plain

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サンプルのコードまんまです。

unit.nginx.org

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.pyapp = responder.API()の記述に合わせて、"callable": "app"を指定するのが必須です。

オプションの詳細な説明はこちら。

unit.nginx.org

動かし方

前回と同じく下で起動できます

 docker-compose build --no-cache
 docker-compose up -d

コンテナ内に入るときは

 docker-compose exec timer_app bash

今回は簡単とは言えルーティングを実装しているのでその確認をしました。 f:id:teru0rc4:20210206191922p:plain

ちゃんとコード通り動いてくれています。

参考

unit.nginx.org

公式ドキュメント。 これをどうやって動かすかを中心に思案しました。

blog.ikedaosushi.com

ライブラリとしてResponderを入れるにあったってどうやって管理するといいのかなということで参考にした所。 これを見つけるまではdockerのPythonとpipenvで作成してしまったPythonの二重環境になってしまっていたので、--system使えばいけそうだけどなんでなんだろうなーっていう理由がしっかり書いてあったので助けられました。