Docker / CI での導入

自分の PC に TeX を入れなくても、組版環境を丸ごと閉じ込めた Docker イメージ を使えば、どこでも同じ結果で .tex を PDF にできます。これは GitHub Actions などの CI(継続的インテグレーション) とも相性がよく、原稿を push するたびに自動でビルドして PDF を産み出せます。このページでは、定番イメージ texlive/texlive の使い方と、CI で組版を自動化・再現可能にするやり方を扱います。

なぜコンテナで組版するのか

ディストリビューションが「TeX 環境そのもの」だとすれば(→ ディストリビューション)、Docker イメージはそれを OS ごと固定して配布する箱 です。箱の中には特定バージョンの TeX Live・エンジン・パッケージ・フォントが封入されていて、手元の OS が Windows でも Mac でも、CI のサーバ上でも、同じ箱を開けば同じ環境 が立ち上がります。「自分の PC では通るのに同僚の環境や CI では失敗する」という食い違いが起きにくいのが最大の利点です。

コンテナとデスクトップ導入は排他ではありません。日常の執筆はエディタとローカルの TeX(→ デスクトップへのインストール)で行い、最終ビルドや共同作業・公開だけをコンテナ/CI に任せる といった併用がよくあります。鍵は 再現性。タグでバージョンを固定すれば、半年後にビルドし直しても同じ PDF が得られます。

texlive/texlive イメージ

最も広く使われている公式イメージが **texlive/texlive で、Island of TeX** が維持しています。配布元は Docker Hub の docker.io/texlive/texlive と GitLab の registry.gitlab.com/islandoftex/images/texlive の 2 か所。中身は TeX Live(2026 年現在の最新安定版は TeX Live 2026、2026 年 3 月リリース)で、エンジン・パッケージ・latexmk などのツールがそろっています。週に一度ほど再ビルドされ、CTAN の更新に追従します。

タグで 規模(scheme) を選べます。minimal / basic / small / medium / full の 5 段階があり、latest は最大構成の full(全パッケージ)に対応します。これに ドキュメントソース の有無を組み合わせられ、無印は両方なし、-doc は文書付き、-src はソース付き、-doc-src は両方入りです。文書とソースは容量が大きく、たとえば latest-doc-src は約 6.5 GB。CI では不要なことが多いので、無印か小さい scheme を選ぶと取得が速くなります。ConTeXt 用の -context 系もあります。

タグ中身
latest最新の full(全パッケージ)。文書・ソースなし迷ったらこれ
latest-smallsmall scheme。軽量で取得が速いCI を速くしたいとき
latest-mediummedium scheme。中規模の構成必要十分なバランス
latest-doc-srcfull + 文書 + ソース。約 6.5 GBローカルで texdoc も引きたいとき
TL2026-…日付固定タグ(後述)。再現性のため本番ビルドを固定したいとき

使い方は簡単で、docker runカレントディレクトリをコンテナ内へマウント し、その中で latexmk を走らせるだけです。次は手元の main.tex を 1 回限りでビルドする例。--rm は実行後にコンテナを破棄し、-v "$PWD":/work で現在地を /work に対応づけ、-w /work をそこを作業ディレクトリにします。生成された PDF は手元のフォルダにそのまま残ります。

terminal
docker run --rm -v "$PWD":/work -w /work texlive/texlive latexmk -pdf main.tex

日本語文書なら latexmk の代わりに、エンジンを指定して動かします。LuaLaTeX なら latexmk -lualatex main.tex、upLaTeX + dvipdfmx の経路なら(.latexmkrc を用意したうえで)latexmk main.tex のように。マウントの仕組みは同じで、入力も出力も手元のディレクトリにあります。

再現性のためにタグを固定 しましょう。latest は内容が静かに変わりますが、Island of TeX は TL{リリース}-{年}-{月}-{日} という 日付固定タグ(例 TL2022-2022-06-05)を残しています。後年のイメージで不具合(regression)に当たったときも、動いていた日付に戻せます。本番ビルドや論文の最終版では、latest ではなくこうした固定タグを texlive/texlive:TL2026-… のように指定するのが安全です。

GitHub Actions で自動ビルド

GitHub のリポジトリなら、.tex を push するたびに GitHub Actions で自動コンパイルできます。定番は **xu-cheng/latex-action(2026 年時点で v4**)。内部で完全な TeX Live 入りコンテナを使い、既定で latexmk を呼ぶため、ワークフローは数行で済みます。次はリポジトリ直下の main.tex を push のたびにビルドし、PDF を成果物(artifact)として保存する最小例です。

.github/workflows/latex.yml
name: Build LaTeX document
on: [push]

jobs:
  build_latex:
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repository
        uses: actions/checkout@v4

      - name: Compile the document
        uses: xu-cheng/latex-action@v4
        with:
          root_file: main.tex

      - name: Upload the PDF
        uses: actions/upload-artifact@v4
        with:
          name: PDF
          path: main.pdf

push すると GitHub のランナー上でコンテナが起動し、root_file に指定した main.texlatexmk でコンパイルされます。既定の latexmk 引数は -pdf -file-line-error -halt-on-error -interaction=nonstopmode で、エラー時に止まり、対話せずに最後まで走る CI 向けの設定です。出来上がった PDF は Actions の実行画面から artifact としてダウンロードできます。

主な入力(with:)を押さえておきましょう。root_file はビルド対象(glob も可)。エンジンは latexmk_use_lualatex: true で LuaLaTeX、latexmk_use_xelatex: true で XeLaTeX に切り替わります(日本語は LuaLaTeX が扱いやすい)。texlive_version20202026 または latest を選べ、再現性のため 年で固定 できます。os は土台の OS で、既定は軽量な alpine、必要なら debian も選べます。\write18 を使うパッケージには latexmk_shell_escape: true を。

ビルドの 高速化 には、実行のたびに毎回入る追加パッケージや、繰り返しダウンロードされるものを actions/cache でキャッシュする手があります。とはいえ latex-action 自体は十分な TeX Live を内蔵しているので、多くのプロジェクトでは素のままでも実用的な速度が出ます。まずは最小構成で動かし、遅さが問題になってから最適化するとよいでしょう。

GitLab CI でも同じ発想

GitLab CI でも考え方は同じで、専用アクションの代わりに イメージを直接指定 します。ジョブの image:texlive/texlive:latest(または日付固定タグ)を書き、script:latexmk -pdf main.tex を走らせ、artifacts: で PDF を保存するだけ。土台が同じイメージなので、GitHub Actions と同じ組版結果が得られます。

.gitlab-ci.yml
build:
  image: texlive/texlive:latest
  script:
    - latexmk -pdf main.tex
  artifacts:
    paths:
      - main.pdf

どのサービスでも本質は変わりません。バージョンを固定したイメージ の中で **latexmk に任せて一括ビルド** し、出てきた PDF を成果物として受け取る。これがコンテナ/CI で TeX を回すときの共通の型です。日々の自動ビルドの仕組み自体は「CI」「自動ビルド」のページでさらに掘り下げています。