gear-code沙箱编译

Overleaf Pro 提供在受保护的沙箱环境中运行编译的选项以满足企业安全性要求。它通过在每个项目中分别运行各自受保护的 Docker 环境来实现这一点。

增强的安全性

由于许多 LaTeX 文档在 PDF 编译过程中可能需要/具有执行任意 shell 命令的能力,沙箱编译是 Server Pro 推荐的做法。如果使用沙箱编译,则每次编译都会在具有受限功能的独立 Docker 容器中运行,这些功能不会与任何其他用户或项目共享,并且不能访问主机网络等外部资源。

circle-exclamation

更容易的包管理

为了避免手动安装包,我们建议启用沙箱编译。这是在 Server Pro 中的一个可配置设置,能够为您的用户提供与 overleaf.com 上相同的 TeX Live 环境,但运行在您自己的本地部署中。沙箱编译使用的 TeX Live 镜像包含针对我们的模板库测试过的最流行的包和字体,确保与本地项目的最大兼容性。

启用沙箱编译允许您配置用户在其项目中可选择的 TeX Live 版本,并为新项目设置默认的 TeX Live 镜像版本。

circle-info

如果您尝试在不使用沙箱编译的情况下运行 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.

circle-info

沙箱编译要求 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

circle-exclamation

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 的 ,但

triangle-exclamation
triangle-exclamation

两个 texlive-full 镜像 。有关详细原因,请参见 环境变量:

chevron-rightTEX_COMPILER_EXTRA_FLAGS 。有关详细原因,请参见.hashtag

现已被 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.1

  • ghcr.io/ayaka-notes/texlive-full:2023.1

  • ghcr.io/ayaka-notes/texlive-full:2022.1

circle-exclamation

遵守(以下正则表达式适用,首个数字表示 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 镜像。

最后更新于