Dockerで動かしたDrupalをPhpStormからリモートデバッグ出来るようにした話です。 Drupalって書いてますがPHPのソフトウェア全般に使える話です。
勢いで最高とか言いましたが、さっきドキュメントを読んでいたら以下の方法よりもっと簡単にやれる方法がありそうなので、また分かったら後日書きます。
概要
先日、Drupalgeddon 2(CVE-2018-7600)の脆弱性について調査したのですが、全部Dockerでvar_dumpで頑張ってたら非常に大変でした。
PhpStormとかIDEでデバッガ使いたいなーと思って、実際にやったら便利になった、という記事です。以前Tomcatの時に同じことやっているのでPHP版ですね。
背景
あんまり環境構築には関係ないので興味ない人はスルーで良いです。
脆弱性調査をするエンジニアの特徴として、複数のバージョンを試したりする必要があるため、直接PC上にインストールするのは難しいという事情があります(環境が汚れると別のバージョン入れたらうまく行かなくなったりするので)。
また、PHPのバージョンも変えたいな〜とかなるともうしんどいです。phpenvとかはもちろんありますが、掛け算で組み合わせあるのでよく分からなくなってきます。
他の人も調査したいって言ったときに環境を説明するのも面倒です。あとは手順渡してもうまくインストールできなかった、とかもあります。
これらを考えるとDockerは脆弱性調査をするエンジニアにとってはこれ以上無いツールです。3年ぐらい前からDockerを使って調査をしてたのですが、ここらへんかなり知見をためつつあるのでどこかで話そうかなーと思ったりもしてます。
ただし、デバッグがしにくい問題もあります。いちいちコンテナに入ってvimで編集したりしていて、環境構築のコストは下がるけど結局調査のコストが高いままだな...と思っていました。しかし脆弱性調査は急にやってくるため、環境構築に時間をかけすぎるわけにもいかず結局vimで頑張って終わることが多かったです。
そして一度調査が終わってしまうとリモートデバッグとかの構築するの面倒になって、いつもやらずに終わってました。
しかし今回、Drupalが短い期間で再度脆弱性を公表するということで、やる気を出して設定してみました。
一度やったらかなり便利になったので共有です。
詳細
DockerでDrupalを動かして、それをPhpStormでデバッグしたいなーと思ったのですが、以下の記事は非常に参考になりました(ありがとうございます)。
Xdebugを動かしてリモートデバッグする方法になります。
自分はMacでPhpStormを起動して、Docker上のDrupalをリモートデバッグしてみました。
環境
- macOS High Sierra (10.13.3)
- PhpStorm 2018.1.1
- Docker for Mac 18.03.0-ce-mac60
- PHP 7.2.4
- Xdebug 2.6.0
サンプル
いつでも簡単に試せるようにセットをGitHub上に置いておきました。 github.com
以下みたいな感じで打てば使えると思います(多分)。
何やってるかについて次から説明していきます。
$ git clone https://github.com/knqyf263/docker-drupal.git $ cd docker-drupal/8.5.2/docker $ ./install.sh $ cd .. $ docker-compose up -d
Dockerイメージ作成
今回のやり方としては、MacにDrupalのソースコードを落としてDockerにマウントする形になります。そのため、既存のdrupalのイメージは使わずに自分で作りました(xdebugもインストールしたかったので)。
本当はDrupalのダウンロードも含めてDockerfileに書きたかったのですが、Docker上のファイルをMac側にマウントする方法がわからず断念しました。もしご存じの方がいたら教えてください。
作ったのは以下のDockerfileになります。
https://github.com/knqyf263/docker-drupal/blob/master/docker/8.5.2/Dockerfile
あとはMac上にDrupalのソースコードをダウンロードしておく必要があるので、適当なシェルスクリプトを書きました。 Drupalのバージョンは8.5.2になってますが、簡単に変えられるようになっています。
https://github.com/knqyf263/docker-drupal/blob/master/docker/8.5.2/install.sh
docker-compose.yml作成
今回はコンテナ一つですが、マウントの設定など覚えておくの面倒なのでDocker Composeを使います。
ファイルは以下になります。
https://github.com/knqyf263/docker-drupal/blob/master/docker-compose.yml
単に上で作ったDockerイメージを起動してるだけです。
起動します。
$ docker-compose up -d
Xdebugの設定
以下のような感じ。
https://github.com/knqyf263/docker-drupal/blob/master/docker/php.ini
xdebug.remote_hostをdocker.for.mac.host.internalにしてます。Docker内からMacのIPアドレスを解決するときに使えるドメイン名なのですね。今回初めて知りました。
PhpStormの設定
プロジェクトのトップディレクトリをPhpStormで開きます。
Remote Debug
先程の参考サイトを見てもらったほうが早いですが、一応メモがてら残しておきます。
まず「Run」→「Edit Configurations」を開きます。
左上の「+」を押して「PHP Remote Debug」を選択します。
Serverの右の「...」を押すとウィンドウが開くので、左上の「+」を押して追加します。
以下のように設定します。
Host: localhost Port: 8000 Debugger: Xdebug
そして、「Use path mappings」でdrupalのソースコードが入っているディレクトリを /var/www/html
とマッピングします。
以下の画像のようになります。
「OK」で戻ったあと、「Server」が先程作ったものになっているか確認します。
Ide keyはphp.iniで指定したものにします。 php.iniで書かなければこっちも設定要らないのですが、何となく設定してみました。
あとは「Name」を適当につけると以下のようになります。
これで設定は完了です。
実行
「Run」→「Start Listening for PHP Debug Connections」にチェックを入れます。これによりXdebugのサーバが立ち上がります(多分)。
あとはブレークポイントを貼ってリクエストを投げるだけです。 PhpStormでデバッグボタンとか押さなくても勝手にデバッグモードになります。
任意コードが実行される瞬間も丸見えですね。