自分の 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 イメージ
広く使われている TeX Live 用イメージが texlive/texlive で、Island of TeX のイメージとして Docker Hub の docker.io/texlive/texlive と GitLab の registry.gitlab.com/islandoftex/images/texlive から取得できます。中身は TeX Live(2026 年現在の安定版は TeX Live 2026)で、エンジン・パッケージ・latexmk などのツールがそろっています。週次ビルドで CTAN の更新に追従します。
タグで 規模(scheme) を選べます。minimal / basic / small / medium / full の 5 段階があり、latest は最大構成の full(全パッケージ)に対応します。これに ドキュメント と ソース の有無を組み合わせられ、無印は両方なし、-doc は文書付き、-src はソース付き、-doc-src は両方入りです。文書とソースは容量が大きく、CI では不要なことが多いので、無印か小さい scheme を選ぶと取得が速くなります。ConTeXt 用の -context 系もあります。
| タグ | 中身 | |
|---|---|---|
latest | 最新の full(全パッケージ)。文書・ソースなし | 迷ったらこれ |
latest-small | small scheme。軽量で取得が速い | CI を速くしたいとき |
latest-medium | medium scheme。中規模の構成 | 必要十分なバランス |
latest-doc-src | full + 文書 + ソース。かなり大きい | ローカルで texdoc も引きたいとき |
historic tag / digest | 過去リリースのタグ、またはイメージ digest | 本番ビルドを固定したいとき |
使い方は簡単で、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 は週次で新しい TeX Live スナップショットへ動くので、最終版の論文や教材では便利な既定値のままにしません。まず TeX Live のリリース年や flavor を選び、必要なら過去リリースのタグを使います。ただし Docker Hub の説明どおり、historic タグのイメージも OS 側の更新で作り直されることがあります。ビット単位で同じコンテナを後から取り出したい仕事では、タグだけでなく image digest まで固定するか、自分のレジストリに動いたイメージを保存します。
GitHub Actions で自動ビルド
GitHub のリポジトリなら、.tex を push するたびに GitHub Actions で自動コンパイルできます。定番は xu-cheng/latex-action@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@v6
- name: Compile the document
uses: xu-cheng/latex-action@v4
with:
root_file: main.tex
- name: Upload the PDF
uses: actions/upload-artifact@v6
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」「自動ビルド」のページでさらに掘り下げています。
CI に渡しやすい原稿にする
CI で失敗しにくい原稿は、手元のエディタ設定に依存していません。ルートファイル、エンジン、補助コマンド、生成物の置き場所 が、リポジトリの中に書かれています。日本語なら main.tex と同じ場所に .latexmkrc を置き、upLaTeX か LuaLaTeX かを明示します。手元でも CI でも同じ latexmk main.tex を叩ける状態にしておくと、提出直前の「自分のPCだけ通る」を避けられます。
# .latexmkrc: upLaTeX + dvipdfmx
$latex = "uplatex -interaction=nonstopmode -halt-on-error %O %S";
$bibtex = "upbibtex %O %B";
$dvipdf = "dvipdfmx %O -o %D %S";
$pdf_mode = 3;この .latexmkrc をコミットしておけば、Docker でも GitHub Actions でも、同じビルド規則で PDF が作られます。追加パッケージをその場で tlmgr install する構成にするより、TeX Live の scheme や固定タグを選んで「最初から入っている環境」に寄せる方が速く、原因追跡もしやすくなります。