elasticsearch travis上的Elasticsearch docker失败,文件夹访问被拒绝,elasticsearch,docker-compose,travis-ci,elasticsearch,Docker Compose,Travis Ci" /> elasticsearch travis上的Elasticsearch docker失败,文件夹访问被拒绝,elasticsearch,docker-compose,travis-ci,elasticsearch,Docker Compose,Travis Ci" />

elasticsearch travis上的Elasticsearch docker失败,文件夹访问被拒绝

elasticsearch travis上的Elasticsearch docker失败,文件夹访问被拒绝,elasticsearch,docker-compose,travis-ci,elasticsearch,Docker Compose,Travis Ci,我在travis上使用Elasticsearch docker图像时遇到问题 给定此docker compose.yml文件: version: '2' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:6.4.2 ports: - "9200:9200" environment: - "discovery.type=single-node

我在travis上使用Elasticsearch docker图像时遇到问题

给定此
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"
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...]
以及以下
.travis.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"
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...]
Elasticsearch引擎无法启动,出现以下异常:

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
elasticsearch|[2018-10-19T08:09:23574][INFO][o.e.n.Node][]正在初始化。。。
elasticsearch_1 |[2018-10-19T08:09:23627][WARN][o.e.b.ElasticsearchUncaughtExceptionHandler][]线程中未捕获的异常[main]
elasticsearch_1 | org.elasticsearch.bootstrap.StartupException:java.lang.IllegalStateException:无法创建节点环境
elasticsearch_1|位于org.elasticsearch.bootstrap.elasticsearch.init(elasticsearch.java:140)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.bootstrap.elasticsearch.execute(elasticsearch.java:127)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.cli.Command.main,不带错误处理(Command.java:124)~[elasticsearch-cli-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.cli.Command.main(Command.java:90)~[elasticsearch-cli-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.bootstrap.elasticsearch.main(elasticsearch.java:93)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.bootstrap.elasticsearch.main(elasticsearch.java:86)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|原因:java.lang.IllegalStateException:未能创建节点环境
elasticsearch_1|位于org.elasticsearch.node.node.(node.java:277)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.node.node.(node.java:256)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.bootstrap.bootstrap$5.(bootstrap.java:213)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.bootstrap.bootstrap.setup(bootstrap.java:213)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.bootstrap.bootstrap.init(bootstrap.java:326)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.bootstrap.elasticsearch.init(elasticsearch.java:136)~[elasticsearch-6.4.2.jar:6.4.2]
弹性搜索| 1 |。。。还有6个
elasticsearch_1|由以下原因引起:java.nio.file.AccessDeniedException:/usr/share/elasticsearch/data/nodes
elasticsearch_1|位于sun.nio.fs.UnixException.translateToIOException(UnixException.java:90)~[?:?]
elasticsearch|u 1|at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)~[?:?]
elasticsearch|u 1|at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)~[?:?]
elasticsearch_1|位于sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:385)~[?:?]
elasticsearch_1|位于java.nio.file.Files.createDirectory(Files.java:682)~[?:?]
elasticsearch_1|位于java.nio.file.Files.createAndCheckIsDirectory(Files.java:789)~[?:?]
elasticsearch_1|位于java.nio.file.Files.createDirectory(Files.java:775)~[?:?]
elasticsearch|1 |位于org.elasticsearch.env.NodeEnvironment.(NodeEnvironment.java:203)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.node.node.(node.java:274)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.node.node.(node.java:256)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.bootstrap.bootstrap$5.(bootstrap.java:213)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.bootstrap.bootstrap.setup(bootstrap.java:213)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.bootstrap.bootstrap.init(bootstrap.java:326)~[elasticsearch-6.4.2.jar:6.4.2]
elasticsearch_1|位于org.elasticsearch.bootstrap.elasticsearch.init(elasticsearch.java:136)~[elasticsearch-6.4.2.jar:6.4.2]
弹性搜索| 1 |。。。还有6个
注意上面由java.nio.file.AccessDeniedException引起的
。文件夹
/elasticsearch/data
已存在,并且似乎像往常一样归属于
travis:travis


我在这里需要帮助确定根本原因,并找到一个解决方案,希望它不涉及使用
chown
chmod
强制执行权限,并且在我的本地机器上也能工作(即没有硬编码的UID)。

默认情况下,Docker容器始终以
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
命令之前)具有启动docker容器的用户权限,则可以避免此问题。对于您的特殊情况,它是:

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...]

当我意识到我对docker卷的理解根本错误时,我解决了这个问题。我认为为了持久化数据,我需要将数据文件夹映射到本地文件系统。但事实上,所需要的只是将其映射到docker数据卷!这样做完全避开了许可问题

在展示解决方案之前,我只想说我调查了本地映射的
/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数据