docker-compose で Mojolicious 8.0 の開発環境を構築
Mojolicious 8.0 がリリースされたので早速 Docker で動作させてみました
検証環境
Windows10 Home Edition VirtualBox 5.2.16 docker-machine version 0.14.0, build 89b8332 docker-compose version 1.20.1, build 5d8c71b perl 5.28.0
ディレクトリ構成
mojo |---app.Dockerfile |---base.Dockerfile |---docker-compose.yml | |---app |---cpanfile
各種設定ファイル
base.Dockerfile
で perl の設定などのスタティックな部分のイメージを作成し、 app.Dockerfile
で変更の多いソースコードを追加するかたちをとることでイメージのビルドが最小限になるようにしています
base.Dockerfile
FROM perl:5.28.0 LABEL maintainer "takaya030" WORKDIR /tmp RUN apt-get update -y && \ apt-get clean && \ rm -fr /var/lib/apt/lists/* # install carton RUN cpanm Carton # create docker user RUN useradd -d /home/docker -m -s /bin/bash -u 1000 -g 50 docker USER 1000 RUN mkdir -p /home/docker/app WORKDIR /home/docker/app ONBUILD ADD ./app /home/docker/app CMD ["true"]
app.Dockerfile
FROM takaya030/perl:5.28.0 LABEL maintainer "takaya030" EXPOSE 3000 CMD ["carton","exec","plackup","-p","3000","myapp.pl"]
docker-compose.yml
version: "2" services: base: build: context: . dockerfile: base.Dockerfile image: "takaya030/perl:5.28.0" volumes: - ./app:/home/docker/app app: build: context: . dockerfile: app.Dockerfile volumes: - ./app:/home/docker/app ports: - "3000:3000" command: ["carton","exec","plackup","-p","3000","myapp.pl"] depends_on: - base
app/cpanfile
requires 'Plack', '1.0047'; requires 'Mojolicious', '8.0';
base イメージのビルド
最初に base
のイメージを作成します
$ cd mojo $ docker-compose build base
Mojolicious と Plack のインストール
base
イメージを使って app
フォルダに Mojolicious
と Plack
をインストールします
$ docker-compose run --rm base carton install
Mojolicious のアプリケーション作成
以下のコマンドでサンプルアプリケーションを作成します
$ docker-compose run --rm base carton exec -- mojo generate lite_app myapp.pl
app イメージのビルド
サンプルアプリケーションを動作させるためのイメージをビルドします
$ docker-compose build app
動作確認
以下のコマンドで Plack
サーバーが起動します
$ docker-compose up -d
web ブラウザで http://192.168.99.100:3000 にアクセスして以下の画面が表示されれば成功です
http://192.168.99.100:3000/perldoc を開くと Mojolicious
の perldoc が表示されます
最後に
app
イメージには今回のサンプルアプリケーションの動作に必要なものがすべて含まれているので、別の環境で動作させたい場合はこのイメージをコピーするだけで OK です