Responder, Pipenv環境をdocker-composeで作ってみた

Web開発

最近流行り(?)のPythonのWebフレームワークである「Responder」を使ってDockerにローカル環境を作成します。

Pythonのパッケージングツールにはpipではなく「Pipenv」を使用してみます。

Dockerfile

dockerの公式ページにDjangoの構成が載っているのでそれを参考にしてみます。
http://docs.docker.jp/compose/django.html

FROM python:3.7.2
RUN mkdir /code
WORKDIR /code
ADD Pipfile /code/
RUN pip install --upgrade pip \
    && pip install pipenv \
    && pipenv install
ADD . /code/

Python3.7.2のイメージを使っているのは気分です。
ResponderはPython3.6以上なら大丈夫です。

イメージにPython3.7.2-alpineを使用してみると以下のエラーが出てました。

unable to execute 'gcc': No such file or directory", "    error: command 'gcc' failed with exit status 1", 

gccなどが足りてないので別途インストールする必要があるのですが、よくわからなかったので大人しくalpineじゃないのを使っています。

後ほど作成するPipfileを使ってpipenv installで依存関係をインストールします。

Pipfile

Pipfileは、Pipenv仮想環境がプロジェクトの依存関係を管理するために使用する専用のファイルです。

PipfileをDcokerfileと同じディレクトリに作成し、必要なパッケージを記述します。

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
responder = "==1.3.0"

[requires]
python_version = "3.7"

Responderは2019年4月16日時点でv1.3.0が最新となっているのでこれを指定します。
常に最新版がよかったらresponder = “*”で大丈夫です。
Pipfileでのバージョンの指定の仕方は以下になります。

# バージョンを指定
responder = "==1.3.0"

# 最新版をインストール
responder = "*"

# 1系の中での最新版をインストール
responder = "==1.*"

docker-compose

docker-compose.ymlファイルDockerfileと同じディレクトリに作成し、以下の設定を追加します。

responder:
    build: .
    command: sh -c "pipenv install && pipenv run python main.py"
    ports:
     - "5042:5042"
    volumes:
     - .:/code

commandでpipenv installしてるのは、複数人開発とかでgit管理しててPipfileに変更があった時にdocker-compose buildせずにupだけで依存関係を入れ直すようにするためだけど、毎回upするたびに確認が走るのも微妙な感じ……

main.py

Reponderを起動するためのファイルを作成します。

import responder
import json

api = responder.API()

# メソッドベースで記述
@api.route("/")
def hello_kashikoma(req, resp):
  # コンテントタイプ指定しないと日本語でブラウザに表示されなかった
  resp.headers = {"Content-Type": "text/plain; charset=utf-8"}
  resp.text = "hello, かしこま!"

# クラスベースでもいける
class Yumekawa:
  def on_get(self, req, resp):
    resp.headers = {"Content-Type": "application/json; charset=utf-8"}
    data = {
      "status": "ゆめかわああ",
    }
    resp.content = json.dumps(data, ensure_ascii=False)

api.add_route("/yumekawa", Yumekawa)

if __name__ == "__main__":
  api.run(address="0.0.0.0")

Dockerだからか、api.run()だとブラウザから接続することができなかった。
api.run(address="0.0.0.0")にすることで接続することができました。

Web開発
スポンサーリンク
hid3をフォローする
踊りながらWebサービスを個人開発している人のブログ
タイトルとURLをコピーしました