【问题标题】:How can I run Lektor within a Docker container?如何在 Docker 容器中运行 Lektor?
【发布时间】:2026-01-28 11:55:01
【问题描述】:

我正在尝试在 docker 容器中运行 lektor,但遇到了问题。

如果我在 Dockerfile 中“添加”(或“复制”)我的源代码文件夹,一切正常,但当然,容器不是动态的,并且不会响应代码中的更改。

如果我改为使用卷,则容器会变成动态的,并且 lektor 会在我进行更改时成功重建并为我的站点提供服务。

但是,当我来发布站点时,容器的日志中出现了一个错误,并且进入了一个永无止境的循环:

Started build Debugging middleware caught exception in streamed response at a point where response headers were already sent. Traceback (most recent call last): File "/usr/local/lib/lektor/lib/python2.7/site-packages/lektor/admin/utils.py", line 18, in generate for event in chain(f(*args, **kwargs), (None,)): File "/usr/local/lib/lektor/lib/python2.7/site-packages/lektor/admin/modules/api.py", line 309, in generator for event in event_iter: File "/usr/local/lib/lektor/lib/python2.7/site-packages/lektor/publisher.py", line 639, in publish self.link_artifacts(path) File "/usr/local/lib/lektor/lib/python2.7/site-packages/lektor/publisher.py", line 602, in link_artifacts link(full_path, dst) OSError: [Errno 18] Invalid cross-device link

最小的 Dockerfile:

FROM python:2.7.11

RUN curl -sf https://www.getlektor.com/install.sh | \
  sed '/stdin/d;s/input = .*/return/' | \
  sh

我实际上在使用 docker-compose。

最小的 docker-compose.yml: version: '2' services: web: build: . ports: - "5000:5000" volumes: - .:/project working_dir: /project/source command: ['lektor', 'server', '--host', '0.0.0.0.']

(我的项目文件夹的结构使得 lektor 项目文件和所有预期的 lektor 文件夹都在“源”子文件夹中)。

【问题讨论】:

  • “无效跨设备链接”的快速 google 显示带有符号链接的内容。 Lektor 在发布时做了什么(我听说过但没用过)?它是否有可能试图在卷和容器中的某些东西之间创建符号链接?也许那里有问题?也许权限。似乎是开始的地方。
  • 是的,lektor 正在尝试使用链接,但它不喜欢卷的安装方式。
  • 似乎是构建过程使用了硬链接,输出文件夹不在源代码路径中。由于源代码是一个挂载的卷并且构建文件夹在容器中的其他位置,因此两个文件系统不同,硬链接失败。
  • 它可以通过命令行配置,所以是的,有点!
  • 我在这里提出了关于 lektor 的问题:github.com/lektor/lektor/issues/315

标签: python docker lektor


【解决方案1】:

lektor 构建过程使用硬链接和构建文件的临时文件夹。如果源代码在一个挂载的卷上(它在一个 docker 卷中),那么这两个文件系统是不同的,并且链接失败如上。

通过命令行部署和构建并指定输出路径可以解决问题(在此处描述:https://www.getlektor.com/docs/deployment/),但这不是 Docker 容器中的一个很好的解决方案,其目的是让生活尽可能简单.

在某些情况下,在 lektor 中进行链接的方法实际上会退回到复制。我创建了一个问题 (https://github.com/lektor/lektor/issues/315),表明如果项目和输出文件夹位于不同的卷上,也会发生回退。我怀疑这会正确解决问题。

【讨论】:

    最近更新 更多