みつきんのメモ

組み込みエンジニアです。Interface誌で「My オリジナルLinuxの作り方」連載中

Dockerを使用して比較的新しいpandoc環境を簡単に構築する

pandocは便利で手放せないが、LTSのディストロを使用したりすると、 更新が追いつかなくなる。

自前で環境を作るにも結構手間がかかるため、一度環境を作ってしまうと、 秘伝のタレのように使い続けてしまいがちになる。

そのため、PCを新調したり、OSを入れ替えたりすると環境の構築が面倒くさい。

Dockerイメージ使用して、比較的新しいpandocの環境を簡単に作れないか模索する。

縛りは下記の点。

  1. pandoc公式のイメージをベースにする
  2. plantumlは使いたい
  3. emacsmarkdown-previewは使いたい

Dockerを使う場合でも、野良のイメージを使うと継続的なメンテナンスが行われていないケースが多く、 結局秘伝のタレになりがちなため、公式が提供しているpandoc/coreなどのイメージを使用する。

pandoc/coreを使う

entrypointにpandocが設定されているため下記のように使うことができる。

$ docker run --rm \
       --volume "$(pwd):/data" \
       --user $(id -u):$(id -g) \
       pandoc/core README.md -o outfile.html

--userを設定することで、出力ファイルの所有権が実行時のユーザーとなるように配慮されている。 これをしないと軒並みroot:rootとなるため、いちいちchownするのが面倒くさい。

dockerhubの例ではpdfを出力しようとしているが、 実際に試すと「pdflatex not found. Please select a different --pdf-engine or install pdflatex」となる。

下記のようなaliasを切っておくと、もうpandocそのもののように使える!(言い過ぎ)

alias pandock=\
'docker run --rm -v "$(pwd):/data" -u $(id -u):$(id -g) pandoc/core'

このイメージのベースとなるOSはAlpineなので、比較的サイズが小さい。 Ubuntuベースのイメージも提供されている。

この状態でpandoc-crossrefは使用可能となっているらしい。

plantumlを使う

インターネッツを徘徊した結果このDockerfileが一番求めていたものに近そう。

frozenbonito/docker-pandoc-eisvogel-ja

下記の点でこれをベースに作業することにした。

  • FROM行のfrozenbonito/pandoc-eisvogel-japandoc/latexがベース
  • 行数が短く処理内容がシンプル

ただ、このDockerfileは下記の点でそのまま使用することはしない。

  1. FROMをpandoc/coreにしたい
  2. ユーザーがrootであることを前提としている部分がある

あと、ダウンロードサイトをみると、githubからダウンロードするのが筋が良さそう。 sourceforge.netでも提供してるみたいだけど。

Dockerfile

こんな感じでDockerfileを作成する。

FROM pandoc/core

RUN apk add --no-cache \
    graphviz \
    openjdk11 \
    python3 \
    py3-pip \
    ttf-droid \
    ttf-droid-nonlatin

ARG plantuml_version="1.2022.2"
RUN wget https://github.com/plantuml/plantuml/releases/download/v${plantuml_version}/plantuml-${plantuml_version}.jar -O /opt/plantuml.jar

RUN pip3 install --upgrade pip
RUN pip3 install pandoc-plantuml-filter

ENV PLANTUML_BIN="java -jar /opt/plantuml.jar"

ENTRYPOINT [ "/usr/local/bin/pandoc" ]

適当にmypandocとかタグをつけてビルドする。

$ docker build . -t mypandoc

plantumlを使う

pandoc-plantumlフィルタがインストールされるので下記のように使用する。

$ docker run --rm \
       --volume "$(pwd):/data" \
       --user $(id -u):$(id -g) \
       mypandoc \
       README.md \
       --filter pandoc-plantuml \
       -o outfile.html

emacsmarkdown-previewを使えるようにする

gfm-modeの機能としてmarkdown-previewがある。 これはmarkdown-commandに設定されたコマンドが実行されると、編集中のmarkdownがhtmlに変換され、 その結果をブラウザで表示するものとなる。

その時に実行されるコマンドは標準入力からmarkdownを受け取り、標準出力にhtmlを吐き出す。 デフォルトではmarkdown-commandはmarkdownと設定されているためPATHが通っているところに markdownという名前のコマンドがあれば良いことになる。 markdownコマンドは次のような使い方が想定される。

$ markdown < README.md
<h1 id="test">test</h1>
<p>testtest</p>

markdownコマンドの内容は下記のようになる。

#!/bin/bash

docker run --rm \
       -i \
       --volume "$(pwd):/data" \
       --user $(id -u):$(id -g) \
       mypandoc \
       -s \
       -o tmp.html

cat tmp.html
rm tmp.html

docker runの時に-iコマンドで標準入力を受け付けるようにするところがポイントとなる。 一時ファイルtmp.htmlを出力し、catすることでhtmlを標準出力に吐き出している。

cssなどを指定したい場合にはコンテナに予め取り込んでおくか、--volumeなどでホスト上のファイルを コンテナから参照できるようにする必要がある。

まとめ

Dockerを使用して比較的新しいpandocの環境を 比較的簡単に作成する方法を調べた。

余談だが、新し目のplantumlはエレメントのデフォルト色が、 あのなんとなく残念なクリーム色では無くなっている。

Dockerは意外と便利。