Ubuntu Weekly Recipe

第531回 RStudio ServerのDockerイメージのカスタマイズ

この記事を読むのに必要な時間:およそ 4 分

第527回ではRStudioのインストール方法を,第529回ではDockerを使ったRStudio Serverについて紹介しました。今回はより便利にDockerイメージを使えるよう,カスタマイズする方法を紹介しましょう。

TinyTeXで日本語PDFを生成できるようにする

第529回でも紹介しているように,Rocker版のRStudio ServerではTeXの実行環境としてRStudioの開発者が作成したTinyTeXを採用しています。

これは一般的なLinuxで使われているTeX Liveではパッケージサイズが大きくなりがちで,結果としてDockerイメージのサイズも大きくなってしまうためです。TeX Liveベースで作られたTinyTeXはTeX Liveのうち最低限必要なものをコンテナイメージに取り込んでおき,残りは必要に応じてtlmgrコマンドでインストールする仕組みになっています。またRの実行環境からtlmgrコマンドを実行できる,tinytexライブラリーも同梱されています。

第529回同様,rocker/verseイメージを起動してみましょう。

$ sudo docker run --rm -d -p 8787:8787 --name verse rocker/verse

メニューからR Markdownファイルを作成し,PDFを選択,output: pdf_documentの部分を次のように変更します。

output:
  pdf_document:
    latex_engine: lualatex
documentclass: ltjsbook

この状態でKnitを実行すると(Ctrl+Shift+Kを押すと)⁠pandocがRmdファイルをTeXファイルに変換し,lualatexがPDFを生成しようとします。しかしながらdocumentclassで指定したクラスファイルltjsbook.clsが見つからないために,luatexjaパッケージのインストールを試みます。

実際,R Markdownのプリアンブルにlatex_engineとしてlualatexを記述した上でPDFを生成しようとすると,いろいろなTeXパッケージをインストールしようとします。documentclassに「ltjsbook」を書いておくと,ltjsbook.clsファイルを提供しているluatexjaパッケージのダウンロードを試みます。

tlmgr search --file --global '/ltjsbook.cls'
Trying to automatically install missing LaTeX packages...
tlmgr install luatexja
(中略)
tlmgr install luatexja
tlmgr install: package already present: luatexja
tlmgr path add
tlmgr search --file --global '/ltjsbook.cls'
! LaTeX Error: File `ltjsbook.cls' not found.

しかしながら,この方法ではなぜかうまくいきません。どうもインストールしたファイルの検索パスがらみの問題のようですが,Dockerイメージの権限が原因かもしれません。あらかじめ必要なパッケージがわかっている場合は,手動でインストールしたほうが良さそうです。

TinyTexにはR向けのtinytexライブラリーがあります。これを使えば,Rコマンドからtlmgrを実行できます。

> tinytex::tlmgr_search('/ltjsbook.cls')
tlmgr search --file --global '/ltjsbook.cls'
luatexja:
    texmf-dist/tex/luatex/luatexja/ltjsbook.cls

> tinytex::tlmgr_install('luatexja')
(中略)
copy /opt/TinyTeX/tlpkg/texlive.tlpdb.tmp to
/opt/TinyTeX/tlpkg/texlive.tlpdb failed:
Operation not permitted at
/opt/TinyTeX/tlpkg/TeXLive/TLPDB.pm line 628.
tlmgr path add

今度は「Operation not permitted」エラーが出てしまいました。rockerイメージのrstudioアカウントはプライマリグループはrstudioであり,サブグループとしてstaffグループに属しています。また,/opt/TinyTex以下の所有者はrootになっているものの,グループはstaffになっています。よってrstudioアカウントでも,/opt/TinyTex以下を変更できるのです。

しかしながらプライマリグループはrstudioであるため,Rコンソールから作成したファイル/opt/TinyTeX/tlpkg/texlive.tlpdb.tmpのグループはrstudioになってしまいます。グループの変更を伴うコピーが「Operation not permitted」と言われているようです※1)⁠

※1
このあたり不具合というよりは,使い方の問題のような気もしています。

さてRコンソールからのTeXパッケージのインストールはうまくいきませんでした。そこで泥臭い方法ではありますが,とりあえずはDockerのコンテナに入ってインストールしてしまいましょう。コンテナ起動時--name verseでコンテナに名前を付けておいたので,以下のようにコンテナ上で直接tlmgrを実行できます。

$ sudo docker exec -it verse tlmgr install luatexja \
  luatexbase ctablestack adobemapping ms filehook
running mktexlsr ...
done running mktexlsr.
tlmgr: package log updated: /opt/TinyTeX/texmf-var/web2c/tlmgr.log

luatexjaの依存関係から最低限必要なパッケージも列挙しています。

また日本語フォントもRockerイメージにはインストールされていませんので,それも合わせてインストールしておきます。

$ sudo docker exec -it verse apt update
$ sudo docker exec -it verse apt install fonts-ipaexfont

あとはKnitを実行すれば,無事に日本語PDFを生成できるはずです。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入