Как запустить 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), предполагающую, что также возможен откат в том случае, если папки проекта и вывода находятся на разных томах. Я подозреваю, что это решит проблему должным образом.