DynamoDB Localの軽量Dockerイメージを自作した話とか

先日AWSのニュースサイトでDynamoDB Localの公式Dockerイメージが公開されていた。

新しいドッカーイメージで Amazon DynamoDB ローカルをさらに容易に

 

試しにdocker pullしてみたら、イメージのサイズが思ったより大きかったので、より軽量なイメージを作成することにした。

 

[作成したDockerfileと使い方]

github.com

というわけで作成した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

 

f:id:kidani_a:20180906074416p:plain

 

http://localhost:8001/shell/にアクセスすると、DynamoDB Localのシェル画面が使えるようになっている。

f:id:kidani_a:20180906074617p:plain

 

[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が入ったイメージを探してきて使うことにした。

 

github.com

 

ありがたや。

 

[他のイメージとの比較]

いくつかのイメージをpullしてみた。

f:id:kidani_a:20180906071104p:plain

  

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となかなかのサイズ。

しかもインメモリモードで起動するので、コンテナを終了するとデータが消えてしまうのが残念な気がする。

f:id:kidani_a:20180905043135p:plain

 

他にもいくつかサイズを見てみたが、本家より軽いイメージもあるようだ。

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イメージを作るだけなら大丈夫に見える。

 

ちょうどこの本が出たので、ライセンス周りについて勉強しなくてはと思っている。 

OSSライセンスの教科書

OSSライセンスの教科書

 

 

[まとめ]

  • Dockerfileを書くのは初めてだったけど、意外と見よう見まねで書けた。
  • Alpineには基本glibcは入っていないので要注意
  • Amazon本家のDynamoDB LocalのDockerイメージはInMemoryなので要注意
  • OSSに限らず)ソフトウェアのライセンスの勉強しとくと良さそう

 

今日のブログ執筆BGMはこちら。

www.youtube.com