Web API開発や調査のためにmitmproxyのコンテナイメージを作成する

Web API開発や調査の際、よくMITMProxyを使用する。MITMProxyは、クライアントからの様々な通信を受け取り、それを他のサーバに流したり、加工して返したりできる。また起動したままリクエストやレスポンスの中身を確認したり、動的に加工したりできるため、開発時には重宝する。

MITMProxyはローカルの環境に直接入れても良いのだけれど、セキュリティ的な観点と、ポータビリティなどを考え、今回はコンテナ環境を整備する事にした。ただし、あくまで自分用だ。

まずは、mitmproxyに読み込ませる簡単なスクリプトを作る。

from mitmproxy import http


def request(flow: http.HTTPFlow) -> None:
    if flow.request.path == "/":
        flow.response = http.Response.make(200, content=b"{}")
        return
    flow.response = http.Response.make(200, content=b"Hello, world!")
main.py

依存関係を記述するためのファイルを作る。依存関係の管理については、今回は pip-tools を使用する。

mitmproxy
requirements.in

Docker HubからBase Imageを取得しておく。

docker pull python:3.13-slim-bookworm

コンテナを起動する。

docker run -it --workdir ${PWD} --volume ${PWD}:${PWD} python:3.13-slim-bookworm bash

コンテナ内で pip-tools をインストールする。

pip install pip-tools

pip-tools が提供している pip-compile コマンドを使用して、依存関係んをロックする。成功すると requirements.in を元にして、 requirements.txt が作成される。

pip-compile

requirements.txt が作成されたら、コンテナを終了しておく。

exit

Dockerfileを作る。通常であればCMDにはmitmproxyを指定するべきかもしれないが、開発ツールとしてはシェルが起動した方が都合が良い事も多いため、bashを指定している。

FROM python:3.13-slim-bookworm
WORKDIR /
COPY ./requirements.txt ./
RUN --mount=type=cache,target=/root/.cache/pip \
    pip install -r ./requirements.txt

RUN mkdir /nonexistent
RUN chown -R nobody:nogroup /nonexistent
COPY  --chown=nobody:nogroup ./main.py .
USER nobody
EXPOSE 8080
CMD ["bash"]
# build: docker build -t my/mitmproxy:202602 .
Dockerfile

コンテナイメージをビルドする。

docker build -t my/mitmproxy:202602 .

これでMITMProxy用のコンテナイメージを作成できたはずだ。

このイメージを使用して、mitmproxyを起動する。

docker run -p 8080:8080 -it my/mitmproxy:202602 mitmproxy -s /main.py

必要に応じてコンテナ内のmain.pyをTRAMPなどを用いて編集したり、ホスト側のボリュームをマウントしてそこに用意したファイルを読み込ますようにすれば、かなり自由にWeb APIの開発や調査を行えるだろう。