Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新(準備中)

Jan 14, 2021 - 日記

RubyでRocksDBつかうためのDockerイメージ

RocksDB は組み込みKeyValueStore型のデータベースです。Googleの公開しているLevelDB のForkで、Facebookが公開しています。ちょっとした情報収集系のスクリプト動かすのには便利でよく使っているのですが、コンパイルが少し厄介なのでこの機会にDockerfileをちゃんと書くことにしました。

最終的に出来上がったのはgithubにあげてあります。

github: tumf/rocksdb-ruby-docker

docker hubはこちらから

docker hub: tumf/rocksdb-ruby-docker

Dockerfile

せっかくなので書いたDockerfileについてメモを残します

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
view raw Dockerfile hosted with ❤ by GitHub

使っているのは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 Image Size (latest by date)

使い方

$ docker pull tumf/rocksdb-ruby
$ docker run -it tumf/rocksdb-ruby irb
irb(main):001:0> require 'rocksdb'
=> true

こんな感じでお楽しみください。