MacにはXQuartzというXサーバーがあり、以前はHomebrewで入れたGhostscriptのウィンドウを出せていたのだが、いつの頃からかHomebrewのGhostscriptからX出力デバイスが削除されてしまった。 しばらくは自力でソースからコンパイルしていたが、バージョンアップのたびにビルドするのも面倒なので、X出力デバイスが当然のように含まれる、UbuntuのGSをDockerで使うことにする。
Xがいらないとき(ps2pdfのときなど、特にファイルのやりとりが発生する場合)はホスト側で実行した方が楽なので、Mac側にもGSは入れてあるけど。
brew install colima docker xquartz
xhost
コマンドを実行し、ローカルホストからのXサーバーへの接続を許可する。
xhost +127.0.0.1
この作業はXQuartz起動ごとに行う必要があるが、XQuartzが起動していなければこのときにXQuartzも起動する。
docker run -it --name gs ubuntu
コンテナ内で:
apt update apt install ghostscript-x export DISPLAY=host.docker.internal:0 gs
これでXQuartz側に窓が出るはず。
ただの
ghostscript
ではなく、後ろに
-x
が付くことに注意。
docker commit --change "ENV DISPLAY=host.docker.internal:0" gs gsとすればよい。 あとは
docker run -it --rm gs
で起動できる。
あるいは、
Dockerfile
を書いてしまい、
ENV
で
DISPLAY
を設定して
docker build
すればよい。
docker run -it --rm -v $(pwd):/work gs gs /work/foo.ps
#!/bin/bash xhost +127.0.0.1 docker run -it --rm -v "${HOME}:${HOME}" -w "$(pwd)" gs gs "$@"
安直に
$HOME
をバインドマウントして、ホスト側のカレントディレクトリをコンテナ側の作業ディレクトリに指定している。
DISPLAY
環境変数を
docker run
で指定してもいいだろう(
-e
オプション)。
xhost
の実行は
/etc/X0.hosts
などを設定しておけば省略できる(
man Xserver
参照)が、XQuartzの場合、
xhost
を実行したときにXQuartzが起動していなければXQuartzが起動する(ちょっと時間がかかる)ので、スクリプト内で
xhost
を実行すればXQuartzが必要に応じて自動的に起動するという効果が得られる。
.bashrc
などに
xhost
を書き込むのはいい案ではない。
XQuartzが起動していないとターミナルの起動に時間がかかってしまう。
host.docker.internal
が自動的にコンテナから見たホストのIPアドレスに変換される。
host.docker.internal:0
へ接続しにいけば、ホスト側のXサーバーにウィンドウが出る。
世の中の解説では0.0.0.0に対して許可していたり、XQuartzのセキュリティを無効にしているものもあるが、localhostを許可すれば十分である。
Copyright (C) 2023 akamoz.jp
$Id: mac-xquartz-gs.htm,v 1.4 2023/10/24 14:55:47 you Exp $