0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Container(apple/container)でVivliostyle CLIイメージを利用する

0
Posted at

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 installnpm 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
  1. VivliostyleはWebブラウザを自動操作しPDFを出力します。Webブラウザのレイアウト処理は大部分がプラットフォーム非依存ですが、特にテキストはOS固有の処理を持ち、ページ分割結果にも影響します。以前の記事で具体例を挙げました。

  2. 他方、Vivliostyle CLIではrenderMode: dockerは非推奨になっています(vivliostyle/vivliostyle-cli#823)。これは一見矛盾しますが、積極的に活用するからこそ非推奨に至った経緯があります。renderMode: dockerはDocker Desktopの機能に依存しており、制作環境の保存のためにぜひコンテナを使いたい商用利用でライセンスの難点がありました。加えて、Podman、WSL Containersなどコンテナ実行基盤の選択肢が増えたことも背景にあります。Vivliostyle CLIがDockerコマンドを内包する構造は、開発の負担を増やし、利用者側の柔軟性を損なっています。廃止以降はコンテナの起動・管理をユーザー側に委ね、Vivliostyle CLIのイメージを利用することを想定しています。

  3. Chrome for Testingは153までLinux ARM64向けに提供されていなかったため、Vivliostyle CLIのイメージもMacをはじめARM64ではx86-64と同じ組版結果にならず使いづらかったのですが、v11.3.0以降では解消しています。

  4. 基本的にはシングルコア性能が支配的です。Vivliostyleに限らず一般論として、ページ組版処理は並列化が困難なタスクです。

  5. 認証を使用したセキュアな方法はお手元のAIエージェントに聞いてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?