既存のPHPで作成されたプロダクトをAmazon ECSを利用し、Hack/HHVMへ移行しようと試みています。
上記に先行して、HHVMのdocker imageを作成し、簡単な稼動確認をしてみました。
最終的には、apacheを経由し、FactCGIで動かそう(docker-compose)としていますが、今回は、Hack/HHVMの単独検証です。
HHVMのdockerfileを作成する
公式HPを参照すると、ubuntu、debianとあるので、ベースイメージはubuntuの最新Ver(2016/7/23時点)の15.10を用いる。
インストール手順は、公式を参照の元記載。
dockerfile
FROM ubuntu:15.10
MAINTAINER takeshi.hirosue@bigtreetc.com
RUN apt-get update \
&& apt-get install -y software-properties-common \
&& apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449 \
&& add-apt-repository "deb http://dl.hhvm.com/ubuntu $(lsb_release -sc) main"
RUN apt-get update \
&& apt-get install -y hhvm
ADD scripts/ /scripts/
ADD .hhconfig /app/
RUN chmod 755 /scripts/*.sh \
&& chmod 755 /app/
EXPOSE 9000
CMD ["/scripts/start.sh"]
start.sh
#!/bin/bash
exec hhvm --mode server -d hhvm.server.port=9000 -d hhvm.server.source_root=/app/
docker image作成/起動
docker imageを作成し、9000ポートで起動する
#build
docker build -t hhvm .
#run
docker run -p 9000:9000 -d --name hhvm hhvm
動作確認(PHP)
phpinfoを作成し、コンテナにコピーし、ブラウザで以下URLへ
http://localhost:9000/phpinfo.php
echo '<?php phpinfo(); ?>' >> phpinfo.php
docker cp phpinfo.php hhvm:/app/
動作確認(Hack)
コンテナへ入って、Hackや型検証を試す
docker exec -ti hhvm /bin/bash
以下コンテナ内
#cd app root
$ cd /app/
$ echo '<?hh echo "hello hhvm\n";' >> hello.hh
$ hhvm hello.hh
hello hhvm
以下の検証ファイルを用いて、型検証を試す
参考ソース
- エラー検証
#run NG
$ hhvm /app/error.hh
Catchable fatal error: Hack type error: Invalid return type at /app/error.hh line 4
#hh_client check NG
$ cd /app/ ; hh_client ; echo $?
error.hh:4:10,29: Invalid return type (Typing[4110])
error.hh:3:15,17: This is an int
error.hh:4:10,29: It is incompatible with a string
2
- 正常検証
#run OK
$ rm /app/error.hh ; hhvm /app/ok.hh
ok! I am string
#hh_client check OK
$ cd /app/ ; hh_client ; echo $?
No errors!
0
※以下利用したサンプル
ok.hh
<?hh
function h(): string {
return 'ok! I am string';
}
echo h() . "\n";
error.hh
<?hh
function h(): int {
return 'error! I am string';
}
echo h() . "\n";
終わりに
Typecheckerは使えそうですね。
次は、docker-composeを利用して、FastCGIで動かしてみたいと思います。