先日AWSのニュースサイトでDynamoDB Localの公式Dockerイメージが公開されていた。
新しいドッカーイメージで Amazon DynamoDB ローカルをさらに容易に
試しにdocker pull
してみたら、イメージのサイズが思ったより大きかったので、より軽量なイメージを作成することにした。
[作成したDockerfileと使い方]
というわけで作成したDockerfileがこちら。
軽いと噂のAlpineにJava 8がインストールされているイメージをベースとした。
FROM anapsix/alpine-java:8 ADD https://s3-us-west-2.amazonaws.com/dynamodb-local/dynamodb_local_latest.tar.gz / RUN gunzip -c dynamodb_local_latest.tar.gz | tar xvf - RUN rm -f dynamodb_local_latest.tar.gz ENTRYPOINT ["java"] CMD ["-Djava.library.path=./DynamoDBLocal_Lib", "-jar", "DynamoDBLocal.jar"] EXPOSE 8000
こんな感じでイメージを作成して起動できる。
git clone https://github.com/kdnakt/docker-dynamodb-local.git cd docker-dynamodb-local docker build -t kdnakt/dynamodb-local . docker run -p 8001:8000 kdnakt/dynamodb-local
http://localhost:8001/shell/にアクセスすると、DynamoDB Localのシェル画面が使えるようになっている。
[Alpineにはglibcがない]
だから軽いんですかね。glibcのサイズとか知らないけど。
最初はFROM java:8-alpine
としてalpineベースにJava8がインストールされたイメージを使っていたが、それだとglibcがインストールされておらず、DynamoDB Localのバックエンドとして動くSQLiteデータベースが動かず、次ようなエラーがでてしまっていた。
SEVERE: [sqlite] SQLiteQueue[cUniqueSessionID_us-west-2.db]: error running job queue com.almworks.sqlite4java.SQLiteException: [-91] cannot load library: java.lang.UnsatisfiedLinkError: /DynamoDBLocal_lib/libsqlite4java-linux-amd64.so: Error relocating /DynamoDBLocal_lib/libsqlite4java-linux-amd64.so: __memcpy_chk: symbol not found at com.almworks.sqlite4java.SQLite.loadLibrary(SQLite.java:97) at com.almworks.sqlite4java.SQLiteConnection.open0(SQLiteConnection.java:1441) at com.almworks.sqlite4java.SQLiteConnection.open(SQLiteConnection.java:282) at com.almworks.sqlite4java.SQLiteConnection.open(SQLiteConnection.java:293) at com.almworks.sqlite4java.SQLiteQueue.openConnection(SQLiteQueue.java:464) at com.almworks.sqlite4java.SQLiteQueue.queueFunction(SQLiteQueue.java:641) at com.almworks.sqlite4java.SQLiteQueue.runQueue(SQLiteQueue.java:623) at com.almworks.sqlite4java.SQLiteQueue.access$000(SQLiteQueue.java:77) at com.almworks.sqlite4java.SQLiteQueue$1.run(SQLiteQueue.java:205) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.UnsatisfiedLinkError: /DynamoDBLocal_lib/libsqlite4java-linux-amd64.so: Error relocating /DynamoDBLocal_lib/libsqlite4java-linux-amd64.so: __memcpy_chk: symbol not found at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824) at java.lang.Runtime.load0(Runtime.java:809) at java.lang.System.load(System.java:1086) at com.almworks.sqlite4java.Internal.tryLoadFromPath(Internal.java:340) at com.almworks.sqlite4java.Internal.loadLibraryX(Internal.java:117) at com.almworks.sqlite4java.SQLite.loadLibrary(SQLite.java:95) ... 9 more
自分でglibcをインストールするようにDockerfileを修正することもできなくはなかったが、既存のものを使った方が楽そうだったので、glibcとjava8が入ったイメージを探してきて使うことにした。
ありがたや。
[他のイメージとの比較]
いくつかのイメージをpullしてみた。
https://hub.docker.com/r/fingershock/dynamodb-local/
既存のイメージではこれが一番軽量(185MB)だった。
同じAlpineベースのようだが、今回自分が作成したイメージの方が軽量だった(163MB)。Dockerfileを比較すると結構違うのでその辺かもしれない。あるいはベースイメージの差か。
ダウンロードしたDynamoDB LocalのzipファイルのSHA256ハッシュの比較とかは入れたほうがよかった気もする。
お前のDockerイメージはまだ重い💢💢💢 - Speaker Deck
この資料によるとRUNをチェーンさせた方がいいらしいが、それも自分のDockerfileではできていないので、次回は気をつけたい。
https://hub.docker.com/r/amazon/dynamodb-local/
本家は446MBとなかなかのサイズ。
しかもインメモリモードで起動するので、コンテナを終了するとデータが消えてしまうのが残念な気がする。
他にもいくつかサイズを見てみたが、本家より軽いイメージもあるようだ。
https://hub.docker.com/r/tray/dynamodb-local/
https://hub.docker.com/r/dwmkerr/dynamodb/
https://github.com/narikei/dynamodb-local-docker
[DynamoDB Localのライセンス]
AWSのライセンス的にこのDockerイメージがDynamoDB Localの派生物に該当するのかどうかよくわからなかったので、Docker Hubには登録していない。
Amazon DynamoDB ローカルライセンス契約 | AWS
みんなDocker Hubに登録しているから、多分大丈夫な筈だけど。
c)本ソフトウェアを修正、改変、改ざんし、手直しし、又はその他その派生物を製作すること、…(略)…、のいずれの行為も行ってはならず
とあるから、修正を加えずにDockerイメージを作るだけなら大丈夫に見える。
ちょうどこの本が出たので、ライセンス周りについて勉強しなくてはと思っている。
[まとめ]
- Dockerfileを書くのは初めてだったけど、意外と見よう見まねで書けた。
- Alpineには基本glibcは入っていないので要注意
- Amazon本家のDynamoDB LocalのDockerイメージはInMemoryなので要注意
- (OSSに限らず)ソフトウェアのライセンスの勉強しとくと良さそう
今日のブログ執筆BGMはこちら。