水底

ScalaとかC#とかネットワークとか

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 用

docker-activator-sample

まとめ

ver1.5未満だと若干トリッキーな構成が必要だったけど, -fの登場でごく自然にできるようになった

attachして様子見ながら開発していけばなんとかなりそう