Док-станция Elasticsearch на travis не работает, доступ к папке запрещен - PullRequest
0 голосов
/ 19 октября 2018

У меня проблемы с использованием образа док-станции Elasticsearch на travis.

Учитывая этот файл 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 или chmod, и это работает на моей локальной машине (т.е. без жестко запрограммированных идентификаторов).

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Я решил эту проблему, когда понял, что мое понимание томов докеров в корне неверно.Я подумал, что для сохранения данных мне нужно сопоставить папку данных с локальной файловой системой.Но на самом деле все, что нужно, это сопоставить его с объемом данных докера!Это вообще обошло проблему с разрешениями.

Прежде чем я покажу решение, позвольте мне сказать, что я исследовал проблему сопоставления пользователей для локальной папки ./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 stuff.

В моем случае лучшим решением было бы создать контейнер данных докера и отобразить его наПапка данных 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:

Вот и все!Сборка теперь работает локально и на travis.

0 голосов
/ 19 октября 2018

Контейнеры 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 команды).Для вашего конкретного случая это:

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