Запуск Elasticsearch в Docker - Java Ошибка - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть локальная Elasticsearch установка, которую я могу запустить без Docker просто отлично. Однако моему приложению требуется специальный пакет, совместимый только с Linux, что означает, что мне нужно запустить свое приложение на виртуальной машине. Из-за этого требования я запустил его в Docker. Тем не менее, я получаю сообщение об ошибке из моего кода Python, указывающего, что ему не удалось установить sh связь с механизмом Elasticsearch (который запускается отдельно от моего приложения). Поскольку у меня не было проблем с тем, чтобы мое приложение и Elasticsearch могли общаться друг с другом до того, как я начал использовать Docker, это заставило меня поверить, что Docker связывался со способностью моего приложения взаимодействовать с моим механизмом Elasticsearch, работающим локально, что аналогично тому, что я испытал в других Docker приложениях, которым нужно взаимодействовать с дополнительными / внешними компонентами. (Кажется, что внутренние компоненты моего приложения работают нормально.) К счастью, уже существовал docker -compose.yml, который может запускать и мое приложение, и механизм Elasticsearch как отдельные (но подключенные) сервисы, которые мы смогли запускать раньше на более старой версии моего приложения, чтобы поддерживать все на виртуальной машине, работающей на сервере. (Я сейчас пытаюсь выполнить несколько масштабных обновлений / слияний.)

Проблема, с которой я столкнулся сейчас, заключается в том, что, похоже, существует какая-то проблема с разрешениями / доступом к файлу. Ошибка , которую я вижу при попытке запустить docker-compose up:

elasticsearch_1 | [2020-04-20 15:37:31,758][WARN ][bootstrap ] unable to install syscall filter: seccomp unavailable: your kernel is buggy and you should upgrade
elasticsearch_1 | Exception in thread "main" java.lang.IllegalStateException: Unable to access 'path.data' (/www/data/nebula)
elasticsearch_1 | Likely root cause: java.nio.file.AccessDeniedException: /www/data/nebula
elasticsearch_1 | at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
elasticsearch_1 | at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
elasticsearch_1 | at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
elasticsearch_1 | at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:384)
elasticsearch_1 | at java.nio.file.Files.createDirectory(Files.java:674)
elasticsearch_1 | at java.nio.file.Files.createAndCheckIsDirectory(Files.java:781)
elasticsearch_1 | at java.nio.file.Files.createDirectories(Files.java:767)
elasticsearch_1 | at org.elasticsearch.bootstrap.Security.ensureDirectoryExists(Security.java:337)
elasticsearch_1 | at org.elasticsearch.bootstrap.Security.addPath(Security.java:314)
elasticsearch_1 | at org.elasticsearch.bootstrap.Security.addFilePermissions(Security.java:259)
elasticsearch_1 | at org.elasticsearch.bootstrap.Security.createPermissions(Security.java:212)
elasticsearch_1 | at org.elasticsearch.bootstrap.Security.configure(Security.java:118)
elasticsearch_1 | at org.elasticsearch.bootstrap.Bootstrap.setupSecurity(Bootstrap.java:196)
elasticsearch_1 | at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:167)
elasticsearch_1 | at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:270)
elasticsearch_1 | at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)
elasticsearch_1 | Refer to the log for complete error details.
cosmosdockerized_elasticsearch_1 exited with code 1

EDIT 3: Я получаю эту ошибку независимо от того, запускаю ли я Elasticsearch локально (т. е. вне Docker) или нет, что, как мне кажется, подтверждает мое подозрение, что запуск моего приложения в Docker портит его способность общаться с Elasticsearch.

Я понятия не имею, почему я получая эту ошибку, учитывая, что тот же Dockerfile смог успешно запустить механизм Elasticsearch на нашем сервере с более старой версией моего приложения.

Dockerfile , который у меня есть для механизма Elasticsearch :

FROM ubuntu:16.04

RUN mkdir /www

COPY ./Nebula-Elasticsearch /www

WORKDIR /www/bin
RUN apt-get update
RUN apt-get install -y openjdk-8-jre software-properties-common
RUN adduser --disabled-password user
RUN chown -R user /www

EXPOSE 9200
EXPOSE 9300

CMD ["su", "-m", "user", "-c", "./elasticsearch --network.host _non_loopback_"]

Вещи, которые я уже пробовал:

  • Комментирование каждой строки Dockerfile и добавление каждой обратно отдельно. Все они кажутся необходимыми (т. Е. Контейнер не может быть собран или запущен должным образом), и я предполагаю, что RUN chown -R user /www предназначен для предотвращения проблем с разрешениями, подобных той, с которой я, похоже, сталкиваюсь.
  • Добавление RUN chmod -R 777 /www как дополнительный обходной путь к проблеме разрешений. Я все еще получаю ту же ошибку.
  • Добавление RUN ls /www/Nebula-Elasticsearch/ в качестве простой проверки / распечатки, чтобы убедиться, что вещи по крайней мере копируются в том месте, где они должны быть. У меня нет причин ожидать, что команда COPY не будет работать, но когда ничего не помогает, я проверяю глупости. Однако эта команда нарушает сборку, выдавая мне ошибку: '/bin/sh -c ls /www/Nebula-Elasticsearch/' returned a non-zero code: 2 Возможно, есть какая-то дополнительная настройка, которую я не знал, что мне нужно было сделать? РЕДАКТИРОВАТЬ: Я не должен был включать "Nebula-Elasticsearch" в путь, так как я скопировал только содержимое каталога, а не сам каталог. Удаление этого имени каталога из пути к файлу заставляет команду ls работать должным образом, и я вижу все файлы, которые ожидаю увидеть там.
  • Одно отличие в том, как я использую Docker на моей машине по сравнению с виртуальной машиной на сервере, где Dockerfile был успешно запущен ранее, мы обычно используем sudo docker-compose up на виртуальной машине. Кажется, я не могу заставить Docker работать на собственной машине с sudo. Попытка сделать это или запустить машину docker с sudo дает мне ошибку Starting "default"... machine does not exist, которую я получаю независимо от того, использую ли я уже машину по умолчанию (без sudo). Попытка создать машину по умолчанию с помощью sudo (после остановки машины по умолчанию) выдает мне другое сообщение о том, что машина по умолчанию Docker уже существует. (Если это помогает, мой локальный компьютер работает на OS X Yosemite (10.10.5 (14F2511)), а виртуальная машина работает на Ubuntu 16.04.6 LTS (GNU / Linux 4.4.0-165-generi * 1080) * x86_64) .)

У кого-нибудь есть понимание, почему я получаю эту ошибку, или что такого особенного в том, что я запускаю образы Docker на моем компьютере против виртуальной машины? (Пожалуйста, имейте в виду, что я все еще довольно новичок в Docker.)

РЕДАКТИРОВАТЬ 2: Теперь мне интересно, возможно, я столкнулся с проблемой OS X, как указано здесь . Я немного поиграюсь с вещами, чтобы посмотреть, смогу ли я запустить их на ВМ на сервере и go оттуда. (Может быть, до этого немного не дойдет; я все еще открыт для любых предложений о том, как исправить проблему, с которой я столкнулся.)

РЕДАКТИРОВАТЬ 4: Я проверил некоторые вещи на своем сервер, и я получаю ту же ошибку там же. Какая бы проблема у меня ни возникала, она не зависит от ОС.

...