ちょっと Docker 扱う機会があったので、個人的なメモ程度に。
入門記事とか、使い方を解説する記事としてはもっと他にいい記事がいろいろあると思います。
今回やること
特定のバージョンの PHP がインストールされた Docker Image を用意して、手元のライブラリの PHPUnit を実行する。
具体的には PHP 5.6 を使って yuyat\compose のユニットテストを実行します。
なお、このライブラリは PHP 5.6 の新機能を使っており、5.6 以降でしか動かないものです。
(このライブラリの詳細については PHP 5.6 の新機能を使って関数を合成する関数を実装する を参照してください)
Docker のインストール
詳細は省きますが、Mac で Homebrew を使って docker と boot2docker をインストールした環境でやっています。
テスト対象のライブラリの取得
composer はあらかじめインストールしているものとします。
$ git clone git@github.com:yuya-takeyama/compose.git
$ cd compose
$ composer install
Docker 上で PHPUnit を実行
以下のコマンドで実行されます。
初回は Docker Image を取得するのに数分かかりますが、2 回目以降は一瞬で実行されるようになります。
$ docker run -it --rm -v `pwd`:/work:ro -w /work php:5.6-cli ./vendor/bin/phpunit
PHPUnit 4.2.6 by Sebastian Bergmann.
Configuration read from /work/phpunit.xml.dist
.......
Time: 903 ms, Memory: 2.75Mb
OK (7 tests, 8 assertions)
以下は実行しているコマンドやオプションについて。
docker run
Docker Image から新たな Container は生成して、その中でコマンドを実行する。
-it
厳密には -i
(--interactive
) と -t
(--tty
) を同時に指定しているもの。
docker run
でアドホックにコマンドを実行するときは大体これを指定する。
-i
でホスト側の STDIN がコンテナ側にもつながる? という感じ。
インタラクティブなコマンドでの入力を待ってくれる。
php -a
とかで試すと良い。
-t
は docker help
を見ると Allocate a psuedo-TTY
となっている。
うまく説明できないけどこれなしで実行すると出力の感じが違うのでまぁつけてます。
--rm
コンテナが終了したら自動的に削除する。
これをつけないとコンテナがどんどん溜まっていってディスクが圧迫されるので大体つける。
-v
コンテナ側からホストの特定のディレクトリをマウントする。
この場合はコンテナ側の /work
がホスト側のカレントディレクトリになる。
コンテナ側でファイルに書き込みを行ったらホスト側にもその変更が行われてしまうが、今回は :ro
をつけることでリードオンリーにしているので、ファイルへの書き込みを行おうとしてもエラーになる。
-w
コマンド実行時のコンテナ内におけるカレントディレクトリを指定する。
php:5.6-cli
Docker Hug Registry 公式の php リポジトリから 5.6-cli
というタグの Docker Image を使用する。
使用可能なタグ一覧は以下を参照。
https://registry.hub.docker.com/_/php/tags/manage/
PHP 5.3.x から 5.6.x まで用意されている。
CLI だけのものもあれば、Apache 同梱のものもある。
./vendor/bin/phpunit
コンテナ内で実行するコマンド。
今回はホスト上で composer install
することによって生成された ./vendor/bin/phpunit
をそのままコンテナ上で実行している。
もっとちゃんとやるときは Composer をインストールした状態の Docker Image とか用意しておくと良いのだろうか。
PHP 5.5 でも実行してみる
前述の通り、今回のライブラリは PHP 5.6 でしか動かないので 5.5 以下ではエラーになる。
以下のようにすることで、ちゃんと指定したバージョンで実行できていることがわかる。
$ docker run -i --rm -v `pwd`:/work:ro -w /work php:5.5-cli ./vendor/bin/phpunit
Parse error: syntax error, unexpected '.', expecting '&' or variable (T_VARIABLE) in /work/src/compose.php on line 4
まとめ
今回はコマンド上で割とアドホックな形に実行してみました。
実際に使ってみる場合は、専用の Docker Image を用意したり、コマンドを自動的に実行してくれるツールだったりが必要だとは思いますが、まずはこの辺りから。