沙箱编译
Overleaf Pro 提供在受保护的沙箱环境中运行编译的选项以满足企业安全性要求。它通过在每个项目中分别运行各自受保护的 Docker 环境来实现这一点。
增强的安全性
由于许多 LaTeX 文档在 PDF 编译过程中可能需要/具有执行任意 shell 命令的能力,沙箱编译是 Server Pro 推荐的做法。如果使用沙箱编译,则每次编译都会在具有受限功能的独立 Docker 容器中运行,这些功能不会与任何其他用户或项目共享,并且不能访问主机网络等外部资源。
如果您尝试运行 Overleaf Pro 不使用 沙箱编译,编译会与其他并发编译一起在主 Docker 容器内运行,用户在运行 LaTeX 编译时对 sharelatex 容器资源(文件系统、网络和环境变量)具有完全的读写访问权限。
更容易的包管理
为了避免手动安装包,我们建议启用沙箱编译。这是在 Server Pro 中的一个可配置设置,能够为您的用户提供与 overleaf.com 上相同的 TeX Live 环境,但运行在您自己的本地部署中。沙箱编译使用的 TeX Live 镜像包含针对我们的模板库测试过的最流行的包和字体,确保与本地项目的最大兼容性。
启用沙箱编译允许您配置用户在其项目中可选择的 TeX Live 版本,并为新项目设置默认的 TeX Live 镜像版本。
如果您尝试在不使用沙箱编译的情况下运行 Overleaf Pro,您的实例将默认为使用一个基本方案版本的 TeX Live 进行编译。该基本版本较轻量,仅包含非常有限的 LaTeX 包子集,这很可能会导致用户出现缺失包的错误,尤其是在他们尝试使用预构建模板时。
由于 Overleaf Pro 的架构设计为可脱机工作,因此没有自动化的方法将 overleaf.com 的模板库模板集成到您的本地部署;然而,可以按每个模板手动完成。有关此如何工作的更多信息,请查看我们关于从 overleaf.com 转移模板的指南: TEMPLATE_ALL_DESCRIPTION=Browse a collection of all available LaTeX templates, categorized by document type, style, and purpose.
沙箱编译要求 sharelatex 容器可以通过绑定挂载访问主机机器上的 Docker socket,以便它可以管理这些兄弟编译容器。
工作原理
当启用沙箱编译时,Docker socket 会从主机挂载到 sharelatex 容器中,以便容器内的编译器服务可以在主机上创建新的 Docker 容器。然后对于每个项目中的每次编译运行,LaTeX 编译器服务(CLSI)将执行以下操作:
将项目文件写出到
OVERLEAF_DATA_PATH.内部的某个位置,
texlive用于本次编译运行的容器。使得
texlive容器从OVERLEAF_DATA_PATH.下的该位置读取项目数据,
texlive并在
容器内编译该项目。
Toolkit 用户 要启用沙箱编译(也称为“兄弟容器”),请在:
SERVER_PRO=true
SIBLING_CONTAINERS_ENABLED=true
Docker-compose 用户
在下面的示例中,请注意以下几点:设置为将 docker socket 卷挂载到 Overleaf 容器中DOCKER_RUNNER设置为将 docker socket 卷挂载到 Overleaf 容器中true设置为SANDBOXED_COMPILESSANDBOXED_COMPILES_HOST_DIR
/data/overleaf_data/data/compiles 5.0.3 , 主机上写入编译数据的位置 从 Overleaf CE/Server Pro 开始, 环境变量已从 SHARELATEX_*.
重新命名为 OVERLEAF_* 如果您使用的是 4.x 版本(或更早版本),请确保变量使用相应的前缀(例如, SHARELATEX_MONGO_URL)
SANDBOXED_COMPILES: "true"
SANDBOXED_COMPILES_HOST_DIR: "/data/overleaf_data/data/compiles"
更改 TexLive 镜像以下环境变量用于指定沙箱编译要使用的 TeX Live 镜像:ALL_TEX_LIVE_DOCKER_IMAGES
(必需)要使用的 TeX Live 镜像的逗号分隔列表。如果使用 Overleaf Toolkit 进行部署,这些镜像将被下载或更新。要跳过下载,请在config/overleaf.rc.
中设置SIBLING_CONTAINERS_PULL=false
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES).
用于镜像的友好名称的逗号分隔列表。如果省略,将使用版本名称(例如,latest-full
更改 TexLive 镜像TEX_LIVE_DOCKER_IMAGE更改 TexLive 镜像用于编译新项目的默认 TeX Live 镜像。该镜像必须包含在
中。如果未设置,
中的第一个镜像将用作默认镜像。 ALL_TEX_LIVE_DOCKER_IMAGE_NAMES 用户可以在项目菜单中为其项目选择镜像。 下面是一个示例,其中默认 TeX Live 镜像是来自 Docker Hub 的 ,但
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES=TeXLive 2025, TeXLive 2024 TEX_LIVE_DOCKER_IMAGE=texlive/texlive:latest-full 如果您使用官方 texlive 镜像
texlive/texlive:latest-full ,您可能会遇到一些问题。官方 texlive 镜像的三大问题是 ❶ 重新编译错误、❷ glossaries 无法正常工作、以及 ❸ 字体缺失。因此我们强烈推荐
ayaka-notes/texlive-full ,它可以为您提供极佳的使用体验。强烈建议至少设置 沙箱编译
两个 texlive-full 镜像 。有关详细原因,请参见 环境变量:
TEX_COMPILER_EXTRA_FLAGS 。有关详细原因,请参见.
现已被 ayaka-notes/overleaf-pro 弃用,因为我们会在 TeXLive Full Docker 镜像中直接进行大部分优化。例如,shell escape 默认已启用。 已弃用当编译在专用容器中进行时,从 TeX 文件内部在编译期间允许运行外部命令相对安全。像
。有关详细原因,请参见minted
这样的包需要此功能。为此,可以使用以下环境变量:
额外传递给 TeX 编译器的标志列表。例如:
-shell-escape -file-line-error 用于镜像的友好名称的逗号分隔列表。如果省略,将使用版本名称(例如, 推荐的 TeX Live 镜像 更改 TexLive 镜像:
这些是一系列为 Overleaf 专门优化的 TeX Live 镜像,也可以添加到和ghcr.io/ayaka-notes/texlive-full:2025.1(也有latest标签)ghcr.io/ayaka-notes/texlive-full:2024.1ghcr.io/ayaka-notes/texlive-full:2023.1ghcr.io/ayaka-notes/texlive-full:2022.1
ghcr.io/ayaka-notes/texlive-full:2021.1 ghcr.io/ayaka-notes/texlive-full:2020.1 关于镜像的标签有严格的格式要求, ^[0-9]+.[0-9]+必须
遵守(以下正则表达式适用,首个数字表示 TeX Live 年份,第二个数字表示补丁版本)。
已知问题
使用6.0.1-ext-v3.3,我在:中有这些设置,
TEX_LIVE_DOCKER_IMAGE=texlive/texlive:latest-fullALL_TEX_LIVE_DOCKER_IMAGES=texlive/texlive:latest-full这在下运行良好。然而,我拉取了另一个 texlive 镜像TEX_LIVE_DOCKER_IMAGE=danteev/texlive:2025-10-15
在日志中,我看到以下内容:
,我在{"name":"clsi","level":50,"err":{"message":"(HTTP code 404) no such container - No such image: texlive/texlive:latest-full ","name":"Error","stack":"Error: (HTTP code 404) no such container - No such image: texlive/texlive:latest-full ...TEX_LIVE_DOCKER_IMAGE=texlive/texlive:latest-full看起来在中的更新设置没有生效。编译仍然尝试运行
镜像,而不是新镜像。
我尝试重启、删除容器并重新运行,但仍然是相同的问题。 有什么解决办法吗?
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES=TeXLiveA TEX_LIVE_DOCKER_IMAGE=texlive/texliveA:latest-full并且在运行一段时间后,您可能想将 TeXLive 镜像修改为
texlive-fullB:latest
。然后,您会发现用户无法编译所有项目。
这是因为每个项目中用于沙箱编译的 TeXLive-Full 镜像名称会保存在数据库中。当用户切换其项目的 TeXLive 版本,例如从 2024 切换到 2025 时,镜像名称会被更改。 当 CLSI 编译一个项目时,它使用数据库中找到的容器镜像名称来直接编译该项目。 如果您只提供一个 Docker 镜像,用户将无法修改用于编译项目的镜像。在这种情况下,您需要编写脚本来手动修改 mongoDB 中所有用户项目的 TeXLive 镜像。
最后更新于