2016-11-09 2 views
1

Ich versuche lektor in einem Andock-Container auszuführen und habe ein Problem gefunden.Wie kann ich Lektor in einem Docker-Container ausführen?

Wenn ich meinen Quellcodeordner in meiner Dockerfile 'ADD' (oder 'COPY'), funktioniert alles perfekt, aber natürlich ist der Container dann nicht dynamisch und reagiert nicht auf Änderungen im Code.

Wenn ich stattdessen ein Volume verwende, wird der Container dynamisch und lektor wird erfolgreich neu erstellt und bedient meine Site, wenn ich Änderungen vornehme.

Allerdings, wenn ich gekommen, um die Website zu veröffentlichen, wird ein Fehler in das Protokoll des Behälters und es tritt eine nie endende Schleife:

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

Minimal Dockerfile:

FROM python:2.7.11 

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

Ich benutze eigentlich docker-komponieren.

Minimal 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.']

(Mein Projektordner ist so strukturiert, dass die lektor Projektdatei und alle erwarteten lektor Ordner sind in der 'Quelle' Unterordner).

+0

Eine schnelle google von 'ungültiger geräteübergreifender Link' zeigt etwas mit symbolischen Links. Was macht Lektor bei der Veröffentlichung (ich habe davon gehört, aber nicht benutzt)? Ist es möglich, dass es versucht, symbolische Verbindungen zwischen Volumes und etwas in dem Container zu erstellen? Vielleicht ein Problem dort? Vielleicht Berechtigungen. Scheint wie der Ort zu beginnen. – johnharris85

+0

Ja, lektor versucht, Links zu verwenden, und es mag nicht, wie das Volume gemountet wird. – Owen

+0

Es scheint, dass der Erstellungsprozess feste Verknüpfungen verwendet und der Ausgabeordner nicht im Quellcodepfad enthalten ist. Da der Quellcode ein bereitgestelltes Volume ist und sich der Erstellungsordner an einer anderen Position im Container befindet, sind die beiden Dateisysteme unterschiedlich und die feste Verbindung schlägt fehl. – Owen

Antwort

0

Der lektor build-Prozess verwendet feste Links und einen temporären Ordner für die erstellten Dateien. Wenn sich der Quellcode auf einem bereitgestellten Volume befindet (das sich in einem Andockvolume befindet), sind die zwei Dateisysteme unterschiedlich und die Verknüpfung schlägt wie oben fehl.

Bereitstellen und Gebäude über die Kommandozeile und den Ausgabepfad spezifizieren, um das Problem bekommen (hier beschrieben: https://www.getlektor.com/docs/deployment/), aber es ist nicht eine große Lösung innerhalb eines Docker Container, in dem das Ziel das Leben so einfach wie möglich zu machen.

Die Methode, die die Verbindung innerhalb von lektor herstellt, greift in einigen Fällen tatsächlich auf das Kopieren zurück. Ich habe ein Problem erstellt (https://github.com/lektor/lektor/issues/315), was darauf hindeutet, dass der Fall auch auftritt, wenn das Projekt und die Ausgabeordner auf verschiedenen Volumes sind. Ich vermute, das würde das Problem richtig lösen.

Verwandte Themen