elasticsearch - travis 上的 Elasticsearch docker 失败,文件夹访问被拒绝
问题描述
我在 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"
和以下.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...]
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
注意Caused by: java.nio.file.AccessDeniedException
以上。该文件夹./elasticsearch/data
存在,并且似乎travis:travis
像往常一样归因于。
我需要帮助确定这里的根本原因,并找到一个希望不涉及使用chown
or暴力破解权限的解决方案,并且该解决方案chmod
也适用于我的本地计算机(即没有硬编码的 uid)。
解决方案
root
默认情况下,Docker 容器始终以用户身份运行。因此,所有正在运行的进程、共享卷、文件夹、文件都将归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 容器的用户权限的文件夹,则可以避免这种情况。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...]
推荐阅读
- amp-html - AMP amp-iframe 通信
- localization - Symfony 4.3.5 - 加载不存在的公共语言环境
- php - 覆盖 Laravel Spark 控制器方法
- java - 从 Weblogic 11 迁移到 Weblogic 12,得到 ClassNotFoundException
- excel - 在 T 列中从颜色更改为文本
- asp.net-core - 运行时类型的 ASP.NET Core ModelBinding
- c++ - 访问头文件中定义的命名空间中的元素
- algorithm - 根据密度函数将平面划分为质量相等的区域
- c# - 使用外部加速度计的 C# 振动传感器
- ruby-on-rails - 将 Rails 5.1 升级到 5.2,找不到 gem 版本,但似乎满足了所有要求