5

Я пытаюсь запустить стек ELK с помощью Docker. Я нашел docker-elk, который уже настроил для меня конфигурацию, используя docker-compose.Как монтировать контейнер-каталог для записи в контейнере?

Я хотел бы сохранить данные поиска elastics на главной машине вместо контейнера. В соответствии с README Докер-лося, я добавил раздел volumes линия для elasticsearch «s из docker-compose.yml:

elasticsearch: 
    image: elasticsearch:latest 
    command: elasticsearch -Des.network.host=0.0.0.0 
    ports: 
    - "9200" 
    - "9300" 
    volumes: 
    - ../../env/elasticsearch:/usr/share/elasticsearch/data 

Однако, когда я бегу docker-compose up я получаю:

$ docker-compose up 
Starting dev_elasticsearch_1 
Starting dev_logstash_1 
Starting dev_kibana_1 
Attaching to dev_elasticsearch_1, dev_logstash_1, dev_kibana_1 
kibana_1  | Stalling for Elasticsearch 
elasticsearch_1 | [2016-03-09 00:23:35,193][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' (/usr/share/elasticsearch/data/elasticsearch) 
elasticsearch_1 | Likely root cause: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/elasticsearch 
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) 
... etc ... 

Глядя в ../../env, каталог elasticsearch был действительно создан, но он был пуст. Если я создаю ../../env/elasticsearch/elasticsearch, тогда я получу ошибку доступа для /usr/share/elasticsearch/data/elasticsearch/nodes. Если я создаю /nodes, то я получаю сообщение об ошибке /nodes/0 и т. Д.

Короче говоря, похоже, что в контейнере нет разрешений на запись в каталоге.

Как получить разрешение на запись? Я попробовал chmod a+wx ../../env/elasticsearch, а затем ему удалось создать следующий каталог, но в этом каталоге есть разрешение drwxr-xr-x, и он снова застревает.

Мне не нравится идея запускать это как root.

+0

Какой выход из 'Докер-Compose запустить --rm elasticsearch стат -c "% U% G"/ USR/доли/elasticsearch/данных '? – kojiro

+0

@kojiro: Я получаю 'UNKNOWN staff' – Claudiu

ответ

2

Docker не стремится беспокоиться об этих вещах в своих базовых изображениях, потому что он ожидает, что вы будете использовать объемы или объемы контейнеров. Установка на хост получает поддержку второго класса. Но пока UID, который владеет каталогом, не равен нулю (и, похоже, он не основан на нашем обмене комментариями), вы должны уйти с запуском elasticsearch как пользователь, который уже владеет каталогом. Вы можете попробовать удалить и повторно добавить пользователя elasticsearch из контейнера, указав его UID.

Вам нужно будет сделать это во время входа, поэтому лучше всего создать пользовательский контейнер. Создайте файл с именем my-entrypoint с этим содержимым:

#!/bin/bash 

# Allow running arbitrary one-off commands 
[[ $1 && $1 != elasticsearch ]] && exec "[email protected]" 
# Otherwise, fix perms and then delegate the rest to vanilla 
target_uid=$(stat -c %u /usr/share/elasticsearch/data) 
userdel elasticsearch 
useradd -u "$target_uid" elasticsearch 
. /docker-entrypoint "[email protected]" 

Убедитесь, что это исполняемый файл. Затем создайте Dockerfile с этим содержимым:

FROM elasticsearch 
COPY my-entrypoint/
ENTRYPOINT ["/my-entrypoint"] 

И, наконец, обновить Докер-compose.yml файл:

elasticsearch: 
    build: . 
    command: elasticsearch -Des.network.host=0.0.0.0 
    ports: 
    - "9200" 
    - "9300" 
    volumes: 
    - ../../env/elasticsearch:/usr/share/elasticsearch/data 

Теперь при запуске docker-compose up он должен создать контейнер elasticsearch с вашими изменениями.

(я должен был сделать что-то подобное когда-то with apache for Magento.)

+0

Ahh интересно! Я попробовал то, что вы здесь написали, но он не закончил работать ... сначала я подумал, что это '/ docker-entrypoint.sh', а не'/docker-entrypoint', но потом все равно не работает. Я решил, однако, основываясь на ваших первых двух предложениях, чтобы упростить мою жизнь и просто использовать именованные тома. – Claudiu

 Смежные вопросы

  • Нет связанных вопросов^_^