環境
$ docker --version
Docker version 20.10.5, build 55c4c88
$ docker-compose --version
docker-compose version 1.28.5, build c4eb3a1f
実行環境構築(簡略版)
次の docker-compose.yml を作れば終わりです。hseeberger/scala-sbt イメージには latest タグがないので、きちんと指定する必要があります。
version: '3'
services:
scala:
image: hseeberger/scala-sbt:8u222_1.3.5_2.13.1
tty: true
volumes: [".:/work"]
実行環境構築(詳細版)
Docker Hub にある hseeberger/scala-sbt イメージを使って構築するのがいいと思います。こちらのイメージは 1,000 万以上のダウンロード数と 148 個のスターを獲得しており、Scala を動かす環境としては安心できると思います。
sbt というのは、Scala プロジェクトの作成やパッケージ管理、ビルドを簡単に行うためのツールセットです。おそらく Scala でのデファクトスタンダードだと思います。
次の docker-compose.yml を作成します。tty: true
を設定している理由は、コンテナの端末に入る必要があるからです。volumes: [".:/work"]
の意味は、docker-compose.yml の存在するディレクトリを、コンテナ内の /work ディレクトリにマウントするという意味です。
version: '3'
services:
scala:
image: hseeberger/scala-sbt:8u222_1.3.5_2.13.1
tty: true
volumes: [".:/work"]
上記ファイルを作成後、次のコマンドを実行して Docker コンテナを立ち上げます。
docker-compose up -d
立ち上げたあと、docker ps
を実行してコンテナ ID を確認します。
$ docker ps
CONTAINER ID IMAGE ...
ec9c762bf36a hseeberger/scala-sbt:8u222_1.3.5_2.13.1 ...
コンテナ ID を確認後、次のようにコマンドを実行してコンテナ内に入ります。プロンプトが root@ec9c762bf36a:~#
に変わると成功です。
$ docker exec -it ec9c762bf36a bash
root@ec9c762bf36a:~# _
/work ディレクトリに移動して、先ほど作成した docker-compose.yml があることを確認します(簡略化のために、プロンプトの表示は #
に省略しています)。
# cd /work
# ls
docker-compose.yml
このディレクトリとホスト側のディレクトリは同期しているため、この中で作成したファイルは両方から閲覧、修正できます。
これで環境が整いました。sbt --version
コマンドを実行して sbt が使えることを確認します。
# sbt --version
sbt version in this project: 1.3.5
sbt script version: 1.3.5
sbt の使い方
公式ドキュメント(日本語)はこちらにあります。
次のコマンドを実行するとプロジェクトを作成できます。sbt/scala-seed.g8
というのは、おそらく GitHub の URL のパス部分を表すのだと思います。実体はこちらだと思います。
# sbt new sbt/scala-seed.g8
上記コマンドを実行すると、プロジェクト名をどうするかについてだけ聞かれます。何も入力せずにエンターキーを押すことで、デフォルトの名前が使用されます。
プロジェクトの作成が終わると、現在のディレクトリに scala-seed-project という名前のディレクトリが生成されます。
このディレクトリに移動後、sbt
コマンドを実行します。これにより、sbt のシェルが立ち上がります。初回実行時は立ち上がるのに数分ほどかかります(たくさんの .jar ファイルがダウンロードされる)が、2回目以降はすぐに立ち上がります。
# cd scala-seed-project
# sbt
...
sbt:Scala Seed Project> _
このシェル内で run
を実行すると、プロジェクトがビルドされて実行されます。シェルに入らずとも sbt run
を実行することでプロジェクトのビルドと実行が可能ですが、この方法だと毎回 Java VM の立ち上げが行われるため時間がかかるとのことです(うろ覚え)。
ファイルを編集するたびに毎回 run
を実行するのは面倒です。sbt では、コマンドの頭に ~
をつけるだけで、「~
の後にあるコマンドを、ファイル内容が変わるたびに実行する」というふうにしてくれます。具体的には、ファイルを編集するたびに run
コマンドを実行したい場合は ~run
を実行します。
> ~run
1. Waiting for source changes in project root... (press enter to interrupt)
_
sbt のパッケージ管理
sbt では、パッケージの追加をコマンドだけで行うことはできません。build.sbt というプロジェクトのルートにあるファイルを編集することでパッケージの追加、修正を行います。
このあたりはまだ調べ切れていないため、時間があるときに調べようと思います。