我在特拉维斯上使用Elasticsearch码头图像有困难。
给定此docker-compose.yml文件:
version: '2'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.4.2
ports:
- "9200:9200"
environment:
- "discovery.type=single-node"
- "transport.host=127.0.0.1"
- "xpack.security.enabled=false"
volumes:
- ./elasticsearch/data:/usr/share/elasticsearch/data
kibana:
image: docker.elastic.co/kibana/kibana:6.4.2
ports:
- "5601:5601"
depends_on:
- elasticsearch
environment:
- "ELASTICSEARCH_URL: http://elasticsearch:9200"以及以下.travis.yml文件:
before_install:
- docker-compose up -d
- docker-compose logs -f &
- wget -q --waitretry=1 --retry-connrefused -T 10 -O - http://127.0.0.1:9200
[...more stuff here...]Elastic搜索引擎无法从以下异常开始:
elasticsearch_1 | [2018-10-19T08:09:23,574][INFO ][o.e.n.Node ] [] initializing ...
elasticsearch_1 | [2018-10-19T08:09:23,627][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main]
elasticsearch_1 | org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: Failed to create node environment
elasticsearch_1 | at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:140) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:127) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:86) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | Caused by: java.lang.IllegalStateException: Failed to create node environment
elasticsearch_1 | at org.elasticsearch.node.Node.<init>(Node.java:277) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.node.Node.<init>(Node.java:256) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:213) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:213) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:326) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | ... 6 more
elasticsearch_1 | Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes
elasticsearch_1 | at sun.nio.fs.UnixException.translateToIOException(UnixException.java:90) ~[?:?]
elasticsearch_1 | at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) ~[?:?]
elasticsearch_1 | at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116) ~[?:?]
elasticsearch_1 | at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:385) ~[?:?]
elasticsearch_1 | at java.nio.file.Files.createDirectory(Files.java:682) ~[?:?]
elasticsearch_1 | at java.nio.file.Files.createAndCheckIsDirectory(Files.java:789) ~[?:?]
elasticsearch_1 | at java.nio.file.Files.createDirectories(Files.java:775) ~[?:?]
elasticsearch_1 | at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:203) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.node.Node.<init>(Node.java:274) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.node.Node.<init>(Node.java:256) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:213) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:213) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:326) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136) ~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1 | ... 6 more注意上面的Caused by: java.nio.file.AccessDeniedException。文件夹./elasticsearch/data是存在的,并且似乎和往常一样被归因于travis:travis。
在这里,我需要帮助识别根本原因,并找到一个解决方案,希望它不涉及暴力强制使用chown或chmod的权限,并且在我的本地机器上也能工作(即没有硬编码的uids)。
发布于 2018-10-20 20:58:11
当我意识到我对码头数量的理解是根本错误时,我就解决了这个问题。我认为为了持久化数据,我需要将数据文件夹映射到本地文件系统。但是实际上,所需要的只是将其映射到一个码头数据卷!这样做完全避开了许可问题。
在给出解决方案之前,我只想说,我研究了本地映射的./elasticsearch/data文件夹的用户映射问题。下面是我所发现的:在travis主机上,文件夹如下所示:
$ ls -la ./elasticsearch/data
total 8
drwxrwxr-x 2 travis travis 4096 Oct 20 18:21 .
drwxrwxr-x 3 travis travis 4096 Oct 20 18:21 ..
-rw-rw-r-- 1 travis travis 0 Oct 20 18:21 .gitkeep在ES容器内:
elasticsearch_1 | total 8
elasticsearch_1 | drwxrwxr-x 2 2000 2000 4096 Oct 20 18:16 .
elasticsearch_1 | drwxrwxr-x 1 elasticsearch root 4096 Sep 26 14:20 ..
elasticsearch_1 | -rw-rw-r-- 1 2000 2000 0 Oct 20 18:16 .gitkeep其中uid 2000是主机的travis用户。不确定需要做什么,因为我在这一点上改变了路线-除了手动chown的东西。
对于我的情况,更好的解决方案是创建一个docker数据容器并将其映射到ES数据文件夹。这样,我可以在不丢失数据的情况下重建ES图像。以下是docker-compose.yml文件的更改方式:
version: '2'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.4.2
ports:
- "9200:9200"
environment:
- "discovery.type=single-node"
- "transport.host=127.0.0.1"
- "xpack.security.enabled=false"
volumes:
- "esdata:/usr/share/elasticsearch/data"
kibana:
image: docker.elastic.co/kibana/kibana:6.4.2
ports:
- "5601:5601"
depends_on:
- elasticsearch
environment:
- "ELASTICSEARCH_URL: http://elasticsearch:9200"
volumes:
esdata:就这样!该构建现在在本地和特拉维斯上工作。
发布于 2018-10-19 20:21:54
默认情况下,码头容器总是以root用户的身份运行。因此,所有正在运行的进程、共享卷、文件夹、文件都将由root用户拥有。
如果您不手动创建共享文件夹,那么docker将创建它,并且它将由root用户拥有:
$ ls -la
total 16
drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 19 23:02 .
drwxrwxr-x 14 ubuntu ubuntu 4096 Oct 19 21:57 ..
-rw-rw-r-- 1 ubuntu ubuntu 534 Oct 19 21:58 docker-compose.yaml
drwxr-xr-x 3 root root 4096 Oct 19 23:02 elasticsearch
$ ls -laR elasticsearch
elasticsearch:
total 12
drwxr-xr-x 3 root root 4096 Oct 19 23:02 .
drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 19 23:02 ..
drwxr-xr-x 2 root root 4096 Oct 19 23:02 data
elasticsearch/data:
total 8
drwxr-xr-x 2 root root 4096 Oct 19 23:02 .
drwxr-xr-x 3 root root 4096 Oct 19 23:02 ..这就是为什么你有java.nio.file.AccessDeniedException。
如果我们创建的./elasticsearch/data文件夹具有在容器启动之前(在docker-compose up命令之前)启动停靠容器的用户的权限,则可以避免。就你的具体情况而言,它是:
before_install:
- mkdir -p elasticsearch/data
- docker-compose up -d
- docker-compose logs -f &
- wget -q --waitretry=1 --retry-connrefused -T 10 -O - http://127.0.0.1:9200
[...more stuff here...]https://stackoverflow.com/questions/52897605
复制相似问题