Как запустить Lektor в контейнере Docker?

Я пытаюсь запустить lektor в Docker-контейнере и столкнулся с проблемой.

Если я "ДОБАВЛЯЮ" (или "КОПИРУЮ") папку с исходным кодом в моем 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 находятся в подпапке 'source').

1 ответ

Процесс сборки lektor использует жесткие ссылки и временную папку для собранных файлов. Если исходный код находится на смонтированном томе (который находится в томе докера), то две файловые системы различаются, и связывание не выполняется, как указано выше.

Развертывание и сборка через командную строку и указание пути вывода могут обойти проблему (описано здесь: https://www.getlektor.com/docs/deployment/), но это не лучшее решение в контейнере Docker, где цель сделать жизнь максимально простой.

Метод, который выполняет связывание в lektor, фактически в некоторых случаях возвращается к копированию. Я создал проблему ( https://github.com/lektor/lektor/issues/315), предполагающую, что также возможен откат в том случае, если папки проекта и вывода находятся на разных томах. Я подозреваю, что это решит проблему должным образом.

Другие вопросы по тегам