キジ(@kiji)です。
タイトルにある通り、Docker上で動かすPuppeteerアプリをmitmproxyを経由させて通信させるときに、ハマったため、メモとして残します。
構造は、以下のようになります。

症状
mitmproxyは起動できているのに、Puppeteerからの接続がタイムアウトすることでした。
mitmproxyは『setup.sh』などのスクリプトファイルで起動から、必要な証明書のダウンロード、設定をするようにしていました。
# mimdump実行
$ mitmdump > /dev/null 2>&1 &
# certファイルのダウンロード
curl -x 127.0.0.1:8080 'http://mitm.it/cert/pem' > ${file_path}
# certファイルを設定
$ update-ca-certificates
# chromiumへ証明書をインストール
for db in $(find ~/-name "cert9.db")
do
dbname =`dirname ${db}`
certutil -A -n "mitmproxy" -t "TCu,Cu,Tu" -i ${file_path} -d sql:${dbname}
done
原因
原因は『cert9.db』が見つからないことでした。これは、Chromiumなどのブラウザが起動した際に作られるファイルでした。
しかし、Dockerで初回起動でそのようなことをしているはずもなく、Chromiumに証明書がインストールされずにいました。
対処
スクレイピング対象へアクセスできることのテストコードを書き、アプリを起動する前に、テストコードを実行することで対応しました。
具体的には、Docckerfileを以下のようにしています。
FROM node
# 必要なライブラリなどのinstall
# テストの実行
# このテストのときに、cert9.dbが作られるようなテストコードを実行する
npm run test
# アプリの起動
npm run start
コメント