2016-11-09 162 views
1

我試圖在碼頭集裝箱內運行lektor,並遇到問題。如何在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。

最小的碼頭工人,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文件夾中的「源」子文件夾)。

+0

「無效的跨設備鏈接」的快速谷歌顯示與符號鏈接的東西。 Lektor在發佈時做了什麼(我聽說過但沒有使用它)?它有可能試圖在容器和容器中的東西之間創建符號鏈接?那裏可能有問題?也許權限。似乎開始的地方。 – johnharris85

+0

是的,lektor試圖使用鏈接,它不喜歡卷的安裝方式。 – Owen

+0

看起來,構建過程使用硬鏈接,並且輸出文件夾不在源代碼路徑中。由於源代碼是已安裝的卷,並且構建文件夾位於容器中的其他位置,因此兩個文件系統不同,硬鏈接失敗。 – Owen

回答

0

lektor構建過程對構建文件使用硬鏈接和臨時文件夾。如果源代碼位於已裝入的捲上(它位於docker卷中),那麼這兩個文件系統是不同的,並且鏈接失敗,如上所述。

通過命令行進行部署和構建並指定輸出路徑可解決此問題(在此處進行了描述:https://www.getlektor.com/docs/deployment/),但在Docker容器中這不是一個很好的解決方案,其目的是讓生活儘可能簡單。

在某些情況下,在lektor內進行鏈接的方法實際上會退回到複製。我創建了一個問題(https://github.com/lektor/lektor/issues/315),暗示還會發生倒退,即項目和輸出文件夾位於不同的捲上。我懷疑這會正確地解決問題。