2017-05-10 83 views
0

我已經創建了一個Dockerfile,用於在Windows Server 2016上使用Docker爲Elasticsearch構建映像。創建映像完美,並且可以使用docker run --rm -p 9200:9200 <imageid>運行它。我可以使用容器的IP地址成功訪問Elasticsearch。鏈接到Github ProjectDocker卷訪問錯誤

的elasticsearch.yml文件配置日誌和數據路徑:

cluster.name: docker-cluster 
network.host: 0.0.0.0 

path.logs: C:/persistent/logs/ 
path.data: C:/persistent/data/ 

discovery.zen.minimum_master_nodes: 1 

我遇到麻煩時,我嘗試使用卷堅持主機上的日誌和數據。我創建了命令

docker volume create elasticsearch 

體積和運行容器:

docker run --rm -p 9200:9200 -v elasticsearch:C:\persistent <imageid> 

,給了我一個Java異常:

[2017-05-10T09:00:47,568][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main] 
org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: Unable to access 'path.logs' (C:\persistent\logs) 
     at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:127) ~[elasticsearch-5.4.0.jar:5.4.0] 
     <snip> 
     at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84) ~[elasticsearch-5.4.0.jar:5.4.0] 
Caused by: java.lang.IllegalStateException: Unable to access 'path.logs' (C:\persistent\logs) 
     at org.elasticsearch.bootstrap.Security.addPath(Security.java:413) ~[elasticsearch-5.4.0.jar:5.4.0] 
     <snip> 
     at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:123) ~[elasticsearch-5.4.0.jar:5.4.0] 
     ... 6 more 
Caused by: java.nio.file.NoSuchFileException: C:\persistent\logs 
     at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79) ~[?:1.8.0_131] 
     <snip> 
     at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:123) ~[elasticsearch-5.4.0.jar:5.4.0] 
     ... 6 more 

奇怪的是,該日誌文件被創建在卷中包含異常的細節。因此日誌文件夾中的日誌文件表示無法訪問日誌文件夾。

我已經嘗試在主機上創建日誌和數據文件夾,並讓Elasticsearch創建它們。我試過使用兩個不同的卷,一個用於日誌,另一個用於數據。它們都導致相同的錯誤。

爲了使日誌和數據文件夾可以被Elasticsearch正確訪問,我需要做些什麼?

回答

1

終於找到答案here。或者至少是解決方法。 Java Path.toRealPath()方法不能正確轉換卷路徑的符號鏈接。解決方法是將容器內的卷文件夾映射到驅動器盤符,並讓java程序使用映射的驅動器訪問它。

VOLUME c:/data 
RUN powershell Set-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices' -Name 'G:' -Value '\??\C:\data' -Type String