singularityを使ったLaTeXのビルド環境を学科GitLabに構築した

自分がubuntuに作業環境を変えたこともあるのだけれど、最近の新入生のMacBookの容量が125GBとMacTeXをいれるには心もとない状態だったので、GitLabのCI/CDでLaTeXのビルドをしようとしていた。

paperist/alpine-texlive-jaにパッチをあたものを使っていたのだけれど、GitLab CIでLaTeXをビルドしようとする場合、 生成したPDFがroot権限になってしまうという問題がある。

su-execとか使ってどうにかしようとしたのだけど、ちょっとめんどくさいしidをdocker runの時に渡さないと行けないのが解りやすくないので厳しい気持ちになっていた。

学科システムでは別のコンテナランタイムとしてsingularityを使っている。

singularityはなんとuid/gidが実行時ユーザーと同じ状態で実行されたり、自動でホームディレクトリがマウントされるなど、今回のようなlatexのコマンドをコンテナから使う環境としてはぴったし。 ということでDockerfileをもとにsingularityのdefファイルを作った。

defファイル

gitlab.ie.u-ryukyu.ac.jp

dockerからの変更点

基本的にDocker時代のものをそのまま利用すれば良いのだけれど、singularityならではの変更点がいくつかある。

  • singularityの場合/tmpにファイルを書き出してbuildするのはNG

    • /tmpはホストの/tmpとマウントされてしまう
    • 今回はLaTeXのインストールスクリプトを置く場所を/latex以下にすることで回避
  • %environmentはビルド時に解決されない

    • PATHをいじってビルドしようとする場合は問題が生じる
    • %postの中で明示的にexportすることで解決

他にはepsを含めたいのでgostscriptを、makeしたいのでmakeをインストールするようにしている。 あまり関係ないが、CTANもミラーサーバーに向けているなどの違いがある。

あとはsingularity run latex.sif uplatex hoge.texとかしたいので、%runscriptで引数をexecするように書く。

%runscript
  exec "$@"

ビルド

singularity build --fakeroot latex.sif latex.def

使い方

sungularity runでも良いのだけれど、sifファイルにはシェバングが埋め込まれていて、自動でsingularity run出来る。

なのでこんな感じで使える。

$latex.sif latexmk
$latex.sif make

gitlab ciの設定は別のエントリで

合わせて読みたい

ie.u-ryukyu.ac.jp