この度Play frameworkの環境をDockerで構築してみたのでメモ。
##使用するdocker image
今回使用したDocker imageはこちら
sbtのimageに関してはhseebergerさんが作成したものがあったので使わせてもらいます。
また、データベースにmysqlを使用するのでmysqlのimageも使います。他のデータベースを使う場合は使いたいデータベースのimageを用意してください。
##作成したdocker-compose.yml
複数のコンテナを使う場合はdocker-composeを使うと便利です。
playframeworkのプロジェクトに以下のymlファイルを作成しました。
version: '3'
services:
sbt:
build: .
image: hseeberger/scala-sbt:8u222_1.3.5_2.13.1
container_name: sbt
volumes:
# このプロジェクト自体をコンテナ内の/rootディレクトリにマウント
- .:/root
ports:
- 9000:9000
expose:
- "9000"
tty: true
db:
image: mysql:5.7
container_name: mysql
environment:
MYSQL_DATABASE: playdb
MYSQL_USER: hoge
MYSQL_PASSWORD: hogepassword
MYSQL_ROOT_PASSWORD: hogepassword
volumes:
- ./db/data:/var/lib/mysql # データを永続化するためローカルにデータをマウント
- ./db/sql:/docker-entrypoint-initdb.d # 初期データの投入関係
- ./db/my.cnf:/etc/mysql/conf.d/my.cnf # 文字コード設定用
ports:
- "3306:3306"
expose:
- "3306"
play framework側の設定
play frameworkにmysqlを導入するための設定をします。
build.sbtとapplication.confに以下のコードを追加します。
libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.41"
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://db:3306/playdb" #コンテナ名:ポート番号/データベース名
db.default.username=hoge
db.default.password=hogepassword
詳しいことはplayframeworkの公式ドキュメントを参照してください。
##dockerでmysqlを導入するときの注意点
dockerのmysqlはデフォルトのままだと latin1という日本語を扱えない文字コードが設定されているのでutf8やutf8mb4に変更しないといけません。
方法はいくつかありますが、私はmy.cnfファイルを使いました。
プロジェクトにdbディレクトリをつくり、そこに以下のmy.cnfファイルを作成して文字コードを指定します。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
explicit-defaults-for-timestamp=1
general-log=1
general-log-file=/var/log/mysql/mysqld.log
[client]
default-character-set=utf8mb4
先程のdocker-compose.ymlにもありましたが、これをdockerコンテナ内のetc/mysql/conf.d/my.cnfにマウントします。
volumes:
- ./db/my.cnf:/etc/mysql/conf.d/my.cnf # 文字コード設定用
こちらが参考にした記事。
これでmysqlで日本語を扱えるようになります。
ただし変更前に一度作成したテーブルの文字コードはそのままになっているので自分で変更する必要があります。
###mysqlの永続化
また、Dockerでmysqlを導入した場合、気をつけないといけないのがデータの永続化についてです。
当然ですがmysqlに保存したデータはmysqlのコンテナが持っているので、もしmysqlのコンテナを削除したら保存したデータも一緒に消えてしまいます。
それでは困るのでデータはコンテナだけでなくローカル側にも持たせてデータを永続化しましょう。
今回docker-compose.ymlにて以下のコードを記述してコンテナ内のデータをローカルにも持たせています。
volumes:
- ./db/data:/var/lib/mysql # データを永続化するためローカルにデータをマウント
参考にした記事