M1 macな人たちに贈るLaTeX Dockerイメージ

# 概要
* この記事では、[M1 macでも使えるLaTeX Dockerイメージ](https://hub.docker.com/r/pman0214/alpine-texlive-ja-epspdf)を紹介します。
    * Ghostscriptも含んでいますが、圧縮サイズで520MB程度です。
    * マルチアーキテクチャビルドしていますので、amd64な人もarm64な人も使えます。
* 拙稿「[pman0214 - DockerでGhostscript対応LaTeX環境構築](https://qiita.com/pman0214/items/23629509c1d0e4388393)」で解説しているLaTeX on Dockerイメージが更新されています。

# はじめに

M1なmacになり、[LaTeX on Docker](https://3846masa.hatenablog.jp/entry/2017/02/08/215920)が使えなくなってしまいました。

MacTeXはサイズが大きく、ダウンロードに膨大な時間がかかります（ミラーサーバの運用者さまにおかれましては、多大なる苦労をしていることと推察いたします。ありがとうございます）。
サイズを小さくしようとすると`install-tl`を使用してインストールするなどが必要です。しかし、インストール時期によりバージョンにバラツキが生じます。複数マシンにインストールすると環境の差が生まれる場合もあります。

そこで、マルチアーキテクチャビルドでLaTeXのDockerイメージを作ることにしました。

# 使い方

「はじめに」に大層なことを書きましたが、使う上で解説することは実はほぼありません。
以下の拙稿をご参照ください。イメージを更新しただけですので、使い方は変わりません。

* [pman0214/DockerでGhostscript対応LaTeX環境構築 - Qiita](https://qiita.com/pman0214/items/23629509c1d0e4388393)
* [pman0214/Docker+VS CodeでLaTeX環境構築 (latexmkrc依存版) - Qiita](https://qiita.com/pman0214/items/87f2ca587176146631a3)

amd64なマシンからdocker pullすればamd64なイメージが、arm64なマシンからdocker pullすればarm64なイメージが取得されます。

# ビルドしたい人向け

ビルドに用いたファイルは[GitHubで公開](https://github.com/pman0214/docker-alpine-texlive-ja-epspdf)しています。

Dockerfileでは主に以下のことをしています。

* alpineイメージをベースとし、glibcをインストール
    * amd64, arm64で共通で使えるパッケージが無いので、ビルドしたバイナリをインストールしつつ設定
* ghostscriptをインストール
* texをインストール

## ビルド環境

当方のビルド環境は以下の通りです。

* Ubuntu 18.04.5 LTS
* Docker Docker version 20.10.7, build f0df350
* Intel Core i9-9900K @3.60GHz / 64GB RAM

DockerのAutomated Buildが課金されてしまうそうなので、現在は手動でビルドしています。そのうちGitHub Action化されるかもしれません。

## 事前準備

拙稿の「[M1 macな人たちに贈るpytorch+jupyterlab docker image / 準備（linuxでビルドする場合のみ） - Qiita](https://qiita.com/pman0214/items/ec2c6831af67ecb3eb04#準備linuxでビルドする場合のみ)」を参照するなどして、マルチアーキテクチャビルド環境を準備しておきます。

## ビルド

アーキテクチャを指定して、`buildx`コマンドを使ってビルドします。
と言っても、指定できる（ビルドに成功する）アーキテクチャは`linux/amd64`と`linux/arm64`のみです。

```bash
% git clone https://github.com/pman0214/docker-alpine-texlive-ja-epspdf.git
% cd docker-alpine-texlive-ja-epspdf
% docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t "alpine-texlive-ja-epspdf:2021" \
  . --load
```

docker hubには以下でpushしています。

```bash
% git clone https://github.com/pman0214/docker-alpine-texlive-ja-epspdf.git
% cd docker-alpine-texlive-ja-epspdf
% docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t "pman0214/alpine-texlive-ja-epspdf:2021" \
  . --push
```

## タグ付け

このままでは`latest`タグがないイメージとなってしまうため、`latest`タグを付けます。
マルチアーキテクチャビルドの場合、同じ名前（タグ）で複数のイメージが存在するため、manifestを操作してタグを操作する必要があります。

作成したいタグのmanifestをmanifestに含めるイメージを指定して作成します。

```bash
% docker manifest create pman0214/alpine-texlive-ja-epspdf:latest \
  pman0214/alpine-texlive-ja-epspdf@sha256:ee9ccaefff9468fae0a34af33355e880933fa56bfaab5865000081f583756621 \
  pman0214/alpine-texlive-ja-epspdf@sha256:414e9dfef683e06ec91547c870c6eaec54c0d7ba484afb6ccda87a90d0656f46
```

sha265部分は、docker hubで確認するか、以下のようなコマンドを実行してmanifestを取得して確認します。

```bash
% docker manifest inspect pman0214/alpine-texlive-ja-epspdf:2021
```

この出力として、以下のようなJSONが得られます。

```json
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1154,
         "digest": "sha256:7be1959252e4b31939683b99438c78343c7bbd8334485e6698d8513be2e558ed",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1154,
         "digest": "sha256:f8538f475c72014d9ac4aae5ee59e46bae657d3ce40f2f35184740f698a3ae8c",
         "platform": {
            "architecture": "arm64",
            "os": "linux"
         }
      }
   ]
}
```

作成したmanifestをpushすれば完了です。

```bash
% docker manifest push pman0214/alpine-texlive-ja-epspdf:latest
```


# おわりに

本記事では、IntelなmacでもM1なmacでも動くlatex dockerイメージを紹介しました。
使い方は過去記事と変わらないため、使い方の説明は過去記事を参照するだけの形となっています。

一方で、ビルドについては簡単に説明しました。
特に、manifestの操作によるタグの付け方を説明しました。
これでやってM1 macでもlatexを使う気になれそうです。