docker
Embulk

Docker コンテナで Embulk を動かす

Docker おじさんです。

ちょっと試しに Embulk を使おうとしたものの、手元のマシンではそのまま動かせなかった。
手元のマシンには Java 9 が入っているが、Embulk v0.9.x は Java 8 じゃないと動かせないらしい。
Java 8 入れるのもなんか嫌だったのでとりあえず Docker で動かすか、となった。

Dockerfile を書く

Dockerfile
FROM openjdk:8-jre-alpine

# Embulk 本体をインストールする
RUN wget -q https://dl.embulk.org/embulk-latest.jar -O /bin/embulk \
  && chmod +x /bin/embulk

# 使いたいプラグインを入れる
RUN apk add --no-cache libc6-compat \
  && embulk gem install embulk-output-td

WORKDIR /work

ENTRYPOINT ["java", "-jar", "/bin/embulk"]

躓いたポイントが2点。

  • FROM openjdk:8-jre-alpine だと embulk gem install で失敗する
    • flock unsupported or native support failed to load というエラーが出る
    • libjffi を入れたら動くかと思ったけど動かなかったので、あきらめて alpine をやめることにした
    • libc6-compat を入れたら解決した1
  • ENTRYPOINT ["/bin/embulk"] だけだとコンテナが起動しない
    • exec user process caused "exec format error" というエラーが出る
    • Docker の ENTRYPOINT では、jar ファイルを直接起動することが出来ない
      • sh -c "..." するか java -jar ... する必要がある

イメージをビルドする

$ docker build -t embulk .

コンテナを起動して Embulk を使う

例えばこんな感じで。

$ docker run --rm -it -v $(pwd):/work embulk --help
$ docker run --rm -it -v $(pwd):/work embulk guess seed.yml -o load.yml
$ docker run --rm -it -v $(pwd):/work embulk run load.yml