Docker卷访问错误

我已经创build了一个Dockerfile来为在Windows Server 2016上使用Docker的Elasticsearch构build一个图像。创build一个完美的图像,我可以使用docker run --rm -p 9200:9200 <imageid>来运行它docker run --rm -p 9200:9200 <imageid> 。 我可以使用容器的IP地址成功访问Elasticsearch。 链接到Github项目 。

elasticsearch.yml文件configuration日志和数据path:

 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 

当我尝试使用卷在主机上保留日志和数据时,遇到了麻烦。 我用这个命令创build了一个卷

 docker volume create elasticsearch 

并运行该容器:

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

这给了我一个Javaexception:

 [2017-05-10T09:00:47,568][WARN ][oebElasticsearchUncaughtExceptionHandler] [] 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 

奇怪的是,日志文件在卷中创build并包含exception详细信息。 所以日志文件夹中的日志文件说日志文件夹不能被访问。

我已经尝试在主机上创build日志和数据文件夹,并让Elasticsearch创build它们。 我试过使用两个不同的卷,一个用于日志,一个用于数据。 他们都导致相同的错误。

我需要做些什么才能使Elasticsearch正确访问日志和数据文件夹?

终于在这里find了答案。 或者至less是解决方法。 Java Path.toRealPath()方法不能正确转换卷path的符号链接。 解决方法是将容器内的卷文件夹映射到驱动器号,并让java程序使用映射的驱动器访问它。

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