自分の 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-small | small scheme。軽量で取得が速い | CI を速くしたいとき |
latest-medium | medium scheme。中規模の構成 | 必要十分なバランス |
latest-doc-src | full + 文書 + ソース。約 6.5 GB | ローカルで texdoc も引きたいとき |
TL2026-… | 日付固定タグ(後述)。再現性のため | 本番ビルドを固定したいとき |
使い方は簡単で、docker run に カレントディレクトリをコンテナ内へマウント し、その中で latexmk を走らせるだけです。次は手元の main.tex を 1 回限りでビルドする例。--rm は実行後にコンテナを破棄し、-v "$PWD":/work で現在地を /work に対応づけ、-w /work をそこを作業ディレクトリにします。生成された PDF は手元のフォルダにそのまま残ります。
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)として保存する最小例です。
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.pdfpush すると GitHub のランナー上でコンテナが起動し、root_file に指定した main.tex が latexmk でコンパイルされます。既定の 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_version で 2020〜2026 または 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 と同じ組版結果が得られます。
build:
image: texlive/texlive:latest
script:
- latexmk -pdf main.tex
artifacts:
paths:
- main.pdfどのサービスでも本質は変わりません。バージョンを固定したイメージ の中で **latexmk に任せて一括ビルド** し、出てきた PDF を成果物として受け取る。これがコンテナ/CI で TeX を回すときの共通の型です。日々の自動ビルドの仕組み自体は「CI」「自動ビルド」のページでさらに掘り下げています。