Vivliostyleの組版処理はOSの影響を受けます1。共同作業者全員の手元で同じPDFを出力したり、出力環境を保管したい場合、コンテナ上で使用するとよいでしょう2。
Container(apple/container)は、Dockerと近いレイヤを担うコンテナ実行基盤です。Apple謹製・Mac専用3ということで、将来にわたってホストとのシームレスな連携や最適化されたパフォーマンスを期待できるはずです。
% container --version
container CLI version 1.4.1 (build: release, commit: 9a8917c)
% container image pull ghcr.io/vivliostyle/cli:11.3.3
% container run ghcr.io/vivliostyle/cli:11.3.3
Usage: vivliostyle [options] [command]
Options:
-v, --version output the version number
-h, --help display help for command
Commands:
create Scaffold a new Vivliostyle project
init Create a Vivliostyle configuration file
build Create PDF, EPUB, and other publication files
preview Open the preview page and interactively save PDFs
theme Create and validate Vivliostyle theme packages
help [command] display help for command
ContainerはDocker CLIと部分的に互換ですが、背後で動作するLinux VMのリソースをコンテナごとに決めます。CPU数はデフォルトの4でも十分でしたが4、メモリはデフォルトの1GBでは不足しました。性能を確認しながら十分な量を割り当ててください。SSHなどリモートで実行する場合はcaffeinateでスリープを抑制するのも有用です。
% container run --cpus 4 --memory 6G ...
Macの標準的なユーザーIDは501、グループIDは20であり、コンテナイメージの/etc/passwdに登録されていません。npmのインストール操作は$HOME/.npm以下に書き込みますが、node_modulesをホストで操作できるように--user "$(id -u):$(id -g)"を設定すると/.npmへの書き込みを要求し失敗します。npm installやnpm ciでは、以下のように--env npm_config_cache=/tmp/.npmなどで書き込み可能なパスを与えるか、プロジェクトの.npmrcに追記します。
% container run \
--cpus 4 \
--memory 6G \
--rm \
--user "$(id -u):$(id -g)" \
--volume .:/data \
--env npm_config_cache=/tmp/.npm \
--entrypoint npm \
ghcr.io/vivliostyle/cli:11.3.3 \
ci
cache=/tmp/.npm
A5判・296ページ・CMYK有効・相互参照を多用した一般的なIT技術書でのパフォーマンス測定結果は次の通りでした。Containerはコンテナごとに個別にVMを割り当てる都合、単発実行ではVMが待機しているDockerに対して不利です。とはいえ、この差は無視できる範囲であることがわかります。Docker Desktopの利用に制限がある状況では現実的な選択肢になるでしょう。
% container run \
--cpus 4 \
--memory 6G \
--rm \
--interactive \
--tty \
--user "$(id -u):$(id -g)" \
--volume .:/data \
--entrypoint /data/node_modules/.bin/vivliostyle \
ghcr.io/vivliostyle/cli:11.3.3 \
build
| 実行基盤 | 1回目 | 2回目 | 3回目 | 平均 | 中央値 |
|---|---|---|---|---|---|
| Docker(Colima, 4 CPU / 6 GiB) | 58.90秒 | 60.07秒 | 59.63秒 | 59.53秒 | 59.63秒 |
| Container | 58.08秒 | 64.37秒 | 69.29秒 | 63.91秒 | 64.37秒 |
プレビューにはX11サーバーが必要です。XQuartzをインストールし、「XQuartz>設定…>セキュリティ>ネットワーク・クライアントからの接続を許可」を有効化したうえで、ここでは簡易的な方法として一時的に認証を無効化します5。/tmp/.X11-unix/X0をコンテナに通し環境変数DISPLAYを設定します。
% /opt/X11/bin/xhost +
access control disabled, clients can connect from any host
% container run \
--cpus 4 \
--memory 6G \
--rm \
--interactive \
--tty \
--user "$(id -u):$(id -g)" \
--volume .:/data \
--volume /tmp/.X11-unix/X0:/tmp/.X11-unix/X0 \
--env DISPLAY=:0 \
--entrypoint /data/node_modules/.bin/vivliostyle \
ghcr.io/vivliostyle/cli:11.3.3 \
preview
終了後は認証を有効に戻してください。
% /opt/X11/bin/xhost -
access control enabled, only authorized clients can connect
-
VivliostyleはWebブラウザを自動操作しPDFを出力します。Webブラウザのレイアウト処理は大部分がプラットフォーム非依存ですが、特にテキストはOS固有の処理を持ち、ページ分割結果にも影響します。以前の記事で具体例を挙げました。 ↩
-
他方、Vivliostyle CLIでは
renderMode: dockerは非推奨になっています(vivliostyle/vivliostyle-cli#823)。これは一見矛盾しますが、積極的に活用するからこそ非推奨に至った経緯があります。renderMode: dockerはDocker Desktopの機能に依存しており、制作環境の保存のためにぜひコンテナを使いたい商用利用でライセンスの難点がありました。加えて、Podman、WSL Containersなどコンテナ実行基盤の選択肢が増えたことも背景にあります。Vivliostyle CLIがDockerコマンドを内包する構造は、開発の負担を増やし、利用者側の柔軟性を損なっています。廃止以降はコンテナの起動・管理をユーザー側に委ね、Vivliostyle CLIのイメージを利用することを想定しています。 ↩ -
Chrome for Testingは153までLinux ARM64向けに提供されていなかったため、Vivliostyle CLIのイメージもMacをはじめARM64ではx86-64と同じ組版結果にならず使いづらかったのですが、v11.3.0以降では解消しています。 ↩
-
基本的にはシングルコア性能が支配的です。Vivliostyleに限らず一般論として、ページ組版処理は並列化が困難なタスクです。 ↩
-
認証を使用したセキュアな方法はお手元のAIエージェントに聞いてください。 ↩