RocksDB は組み込みKeyValueStore型のデータベースです。Googleの公開しているLevelDB のForkで、Facebookが公開しています。ちょっとした情報収集系のスクリプト動かすのには便利でよく使っているのですが、コンパイルが少し厄介なのでこの機会にDockerfileをちゃんと書くことにしました。
最終的に出来上がったのはgithubにあげてあります。
github: tumf/rocksdb-ruby-docker
docker hubはこちらから
docker hub: tumf/rocksdb-ruby-docker
Dockerfile
せっかくなので書いたDockerfileについてメモを残します
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ARG rocksdb_version="6.15.2" | |
ARG ruby_version="2.7.2" | |
FROM golang:alpine as build-stage | |
ARG rocksdb_version | |
RUN apk add --update --no-cache build-base linux-headers git cmake bash perl | |
RUN apk add --update --no-cache zlib zlib-dev bzip2 bzip2-dev snappy snappy-dev lz4 lz4-dev zstd zstd-dev gflags | |
# Install Rocksdb | |
RUN cd /tmp && \ | |
git clone --depth 1 https://github.com/facebook/rocksdb.git -b v${rocksdb_version} && \ | |
cd rocksdb && \ | |
make shared_lib && \ | |
mkdir -p /usr/local/rocksdb/lib && \ | |
mkdir /usr/local/rocksdb/include && \ | |
cp librocksdb.so* /usr/local/rocksdb/lib && \ | |
cp /usr/local/rocksdb/lib/librocksdb.so* /usr/lib/ && \ | |
cp -r include /usr/local/rocksdb/ && \ | |
cp -r include/* /usr/include/ && \ | |
rm -R /tmp/rocksdb/ | |
FROM ruby:${ruby_version}-alpine | |
ARG ruby_version | |
COPY --from=build-stage /usr/local/rocksdb /usr/local/ | |
RUN apk add --no-cache --update --virtual=build-dependencies build-base linux-headers gcc g++ && \ | |
gem install rocksdb-ruby && \ | |
apk del build-dependencies && \ | |
rm -rf /tmp/* /var/tmp/* /var/cache/apk/* | |
RUN apk add --update --no-cache snappy gflags libbz2 zlib lz4-libs zstd-libs |
使っているのはRocksDBの現時点での最新版6.15.2
とRuby2系の最新版2.7.2
で冒頭のARGでバージョンを切り替えられるようになっています。
ARG rocksdb_version="6.15.2"
ARG ruby_version="2.7.2"
現状、Ruby3にするとビルド失敗するので今後の課題。
RocksDBはC++で書かれていて、開発系のライブラリに依存するので、マルチステージビルドで実装してます。最終的にはruby-alpineイメージを採用。
イメージサイズはこんな感じ。
使い方
$ docker pull tumf/rocksdb-ruby
$ docker run -it tumf/rocksdb-ruby irb
irb(main):001:0> require 'rocksdb'
=> true
こんな感じでお楽しみください。