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!")
依存関係を記述するためのファイルを作る。依存関係の管理については、今回は pip-tools を使用する。
mitmproxyDocker 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 が作成されたら、コンテナを終了しておく。
exitDockerfileを作る。通常であれば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 .コンテナイメージをビルドする。
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の開発や調査を行えるだろう。