Scala + activator + Docker + IntellijIDEA (java8)での開発〜デプロイ
なんで
仮想環境上での開発はVagrantベースのものが主流らしい. なぜかDocker版のサンプルは見つからない…
でもDocker使いたい…使いたくない?
ポートやらパスやら名前やら細かいオプションやらは適宜調整してください
CIやdocker-composeを伴わない小規模向けの記事ですが, 調整次第で応用可能と思います
(おまけ程度に) under ver1.5
- Dockerfileは1ディレクトリに1つ
- Dockerfileより上位階層のファイルは(基本的に)扱えない
という2つの強い制約があるため結構面倒.
Develop
コンテナ実行後は localhost:5005
にIntellijIDEAからデバッグ接続する
boot2dockerなどを使っている場合はポートフォワーディングを忘れないようにする.
ホストにポートマッピング(したく|でき)ない場合は, DockerfileにEXPOSE 5005
指定を追加して, 代わりにコンテナのIPアドレスを使って接続するなどして対応.
おおまかな流れ
- ベースとなるイメージを作成し, 開発ではそのまま利用する
- デバッグポート5005を開ける
- リソースはホストと共有
- 実行はコンテナ上でデバッグポート5005を開けながら行う
- 開発は上記のポートに接続しながらホスト側のIntellijIDEAから行う
$ cd project_name $ docker build -t base_image_name tools/dev $ docker run -d -p 5005:5005 -p 9000:9000 --name develop_container_name -v $(pwd):/project_name base_image_name
project_name/tools/dev/Dockerfile
FROM ubuntu # install java8 RUN apt-get install -y software-properties-common RUN add-apt-repository ppa:webupd8team/java RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections RUN apt-get update && apt-get clean RUN apt-get install -y oracle-java8-installer # ONBUILD時, つまりデプロイ時は, `docker run -v` で # ファイル群を追加するのではなく, COPYで追加する. # developには直接は関係ない. ONBULD COPY . /project_name WORKDIR /project_name CMD ["./activator", "run", "-jvm-debug", "5005"]
Deploy
おおまかな流れ
- developで作成したイメージをベースとする
- リソースはビルド時にすべてコンテナ上にコピーする
- デバッグ実行をアプリの起動で上書きする
$ cd project_name $ docker build -t deploy_image_name . $ docker run -d -p 9000:9000 --name deploy_container_name deploy_image_name
project_root/Dockerfile
FROM base_image_name CMD ["./activator", "start"]
(こっちがメインだ) ver1.5 or later
ver1.5からビルド時にDockerfileを指定できる -f
オプションが追加された. うれしい.
これでver1.5未満にあった制約をすべて回避できる.
おおまかな流れ
- ベースイメージとして環境構築をする
- ベースイメージをベースとして, 開発/デプロイ それぞれのタイミングでリソースを 共有/コピー
- デバッグ等はver1.5未満と同じ
baseの作成
$ cd project_name $ docker build -t base_image_name -f tools/base/Dockerfile .
project_name/tools/base/Dockerfile
FROM ubuntu # install java8 RUN apt-get install -y software-properties-common RUN add-apt-repository ppa:webupd8team/java RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections RUN apt-get update && apt-get clean RUN apt-get install -y oracle-java8-installer WORKDIR /project_name
Develop
$ cd project_name $ docker build -t develop_image_name -f tools/dev/Dockerfile . $ docker run -d -p 5005:5005 -p 9000:9000 --name develop_container_name -v $(pwd):/project_name develop_image_name
project_name/tools/dev/Dockerfile
FROM base_image_name CMD ["./activator", "run", "-jvm-debug", "5005"]
Deploy
$ cd project_name $ docker build -t deploy_image_name -f tools/dep/Dockerfile . $ docker run -d -p 9000:9000 --name deploy_container_name deploy_image_name
project_name/tools/dep/Dockerfile
FROM base_image_name COPY . /project_name CMD ["./activator", "start"]
sample
ver1.5 or later 用
まとめ
ver1.5未満だと若干トリッキーな構成が必要だったけど, -f
の登場でごく自然にできるようになった
attachして様子見ながら開発していけばなんとかなりそう