2017-05-10 87 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