LibreOffice Calcの入ったDockerイメージを作ってヘッドレスで動かす

とりあえず自分が使いやすいようにポータブルにしておくとよいかも? くらいの思いつきでやってみましたが、たとえば開発チームのメンバーにちょっとしたツールを渡したいとき(そのためだけに LibreOffice をインストールしてもらわなくて済む)とか、サーバの環境を汚さずに使いたいときに都合が良いかもしれませんね。


下記では例として Calc が入ったイメージを作って fods ファイルを ods ファイルに変換します。 Writer とかでも同じようにできるのではないでしょうか。


Dockerfile 書く。 関連しそうなパッケージはいくつかあるのですが、とりあえず libreoffice-calc をインストールすれば変換処理は動きました。

FROM ubuntu:18.04

RUN apt-get update \
  && apt-get -y install --no-install-recommends \
    libreoffice-calc \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

イメージをビルド。

docker build -t libo_calc:test .

イメージのサイズは 426MB になりました。


コンテナ内で実行するシェルスクリプト container_fods2ods.sh を用意。 汎用化は置いておいてひとまずベタ書きです。

あと、動作する最低限のサンプルということで --headless だけ付けていますが、 他にも --nologo などのオプションがあります。詳しくは LibreOfficeでドキュメントコンバータを作ろう - Qiita を参照してください。

temp_fods=/tmp/temp.fods
temp_ods=/tmp/temp.ods

# 標準入力から受け取る
cat > $temp_fods

cd /tmp

soffice \
  --headless \
  --convert-to ods \
  $temp_fods \
  >&2
# => /tmp/temp.ods に出力される

cat $temp_ods

下記のようなメッセージが標準出力に出て都合が悪いので >&2標準エラー出力にリダイレクトしています。 Java の実行環境がないよと言われてますが、今やろうとしている fods → ods の変換に関しては問題ないようなのでいったん無視。

javaldx: Could not find a Java Runtime Environment!
Please ensure that a JVM and the package libreoffice-java-common
is installed.
If it is already installed then try removing ~/.libreoffice/3/user/config/javasettings_Linux_*.xml
Warning: failed to read path from javaldx
convert /tmp/temp.fods -> /tmp/temp.ods using filter : calc8

ホスト側でコマンドとして使うシェルスクリプト fods2ods.sh を用意。

#!/bin/bash

file_in="$1"; shift
file_out="$1"; shift

cat $file_in \
  | docker run --rm -i \
      -v "$(pwd):/root/work/" \
      libo_calc:test \
      bash /root/work/container_fods2ods.sh \
  > $file_out

実行。

chmod u+x fods2ods.sh
./fods2ods.sh sample.fods sample_output.ods

参考