LoginSignup
3
4

More than 5 years have passed since last update.

HHVM (HipHop Virtual Machine for PHP)/Hack のdocker imageを作成する

Posted at

既存の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で動かしてみたいと思います。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4