动机
原始问题来自pandoc 讨论。
pandoc --pdf-engine=lualatex test.md -o test.pdf
使用如下源文件构建 Docker 镜像test.md
:
---
mainfont: TeX Gyre Termes
---
Lorem ipsum ttt
关于 pandoc 的 Docker 镜像的背景信息
这官方 Docker 镜像pandoc/latex:latest
已安装TeXLive 下/opt
其写入权限仅保留给 root 用户。默认情况下,容器以 root 用户身份运行。
$ docker run --rm --entrypoint="" pandoc/latex:latest sh -c 'whoami'
root
要使用 Docker 运行 pandoc,将 README.md 转换为 README.pdf:
$ docker run --rm --volume "$(pwd):/data" --user $(id -u):$(id -g) \ pandoc/latex README.md -o README.pdf
!
$(pwd)
将当前目录中的所有内容放入/data
从映像构建的 Docker 容器中pandoc/latex:latest
,然后容器pandoc README.md -o README.pdf
使用基础系统中的用户和组权限运行,然后结束。README.pdf
容器结束后输出仍然存在。包括,--rm
以便它不会记录在容器列表中docker ps
。
Docker 的背景信息USER
为了避免在 Docker 容器中以 root 身份运行,可以指定USER name
Dockerfile
。
问题
我尝试test.md
编译我的Dockerfile
,它使用了普通用户的身份USER pptruser
,我收到了一条无用的消息,显示“致命错误”。为了进一步了解该问题,我首先test.md
使用test.tex
$ pandoc -s test.md -o test.tex
在我使用 Docker 容器编译 LuaLaTeX 之前,我的Dockerfile
。
$ docker run --rm --volume "$(pwd):/home/pptruser" --user $(id -u):$(id -g) \
customDockerImage:1.0 --pdf-engine=lualatex test.md -o test.pdf
This is LuaHBTeX, Version 1.12.0 (TeX Live 2020)
restricted system commands enabled.
(./201113-TAM-compte-rendu.tex
LaTeX2e <2020-10-01> patch level 2
luaotfload | load : FATAL ERROR
luaotfload | load : × Failed to load "fontloader" module "basics-gen".
luaotfload | load : × Error message:
luaotfload | load : × "...dir/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua:306: system : no writeable cache path, quiting".
stack traceback:
...dir/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua:174: in local 'load_fontloader_module'
...dir/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua:308: in upvalue 'init_main'
...dir/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua:560: in function 'luaotfload-init.lua'
...dir/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua:298: in field 'main'
[\directlua]:1: in main chunk
...dir/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua:306: system : no wr
iteable cache path, quiting
stack traceback:
[C]: in function 'error'
...dir/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua:306: in function '
os.exit'
...dir/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua:177: in local 'loa
d_fontloader_module'
...dir/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua:308: in upvalue 'i
nit_main'
...dir/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua:560: in function '
luaotfload-init.lua'
...dir/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua:298: in field 'mai
n'
[\directlua]:1: in main chunk.
<everyjob> ...ring \\def\string \\encodingdefault{OT1}')end }
\let \f@encoding \encoding...
l.1
% Options for packages loaded elsewhere
原因no writeable cache path
导致luaotfload
了错误。我发现,如果我删除USER pptruser
相关设置并以 root 身份运行所有内容,则错误就会消失。
我想知道是否有办法构建一个,以便包含字体 TeX Gyre Termes 与 LuaLaTeX PDf 引擎Dockerfile
的编译可以工作。test.md
答案1
解决方案非常简单:确定“可写缓存路径”,并赋予每个人可写权限。在 Docker 镜像 pandoc/latex:latest 中,它是/opt/texlive/texdir/texmf-var
。
我解决了这个问题提交 VincentTam/pandoc-mermaid-docker@d86343f0
在 GitLab 上附加
chmod o+w /opt/texlive/texdir/texmf-var
RUN
创建用户的命令(pptruser
在从 root 更改为普通用户之前的某个地方)。