5

Sto tentando di eseguire uno stack ELK utilizzando Docker. Ho trovato docker-elk che ha già configurato la configurazione per me, utilizzando docker-compose.Come installare la directory host scrivibile dal contenitore?

Vorrei memorizzare i dati elasticsearch sulla macchina host anziché su un container. Come da README Docker-alci, ho aggiunto una sezione volumes linea per elasticsearch s' di 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 

Tuttavia, quando corro docker-compose up ottengo:

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

Guardando in ../../env, la directory elasticsearch è stato infatti creato, ma era vuoto. Se creo ../../env/elasticsearch/elasticsearch, viene visualizzato un errore di accesso per /usr/share/elasticsearch/data/elasticsearch/nodes. Se creo /nodes, viene visualizzato un errore per /nodes/0, ecc.

In breve, sembra che il contenitore non disponga delle autorizzazioni di scrittura sulla directory.

Come ottengo avere i permessi di scrittura? Ho provato chmod a+wx ../../env/elasticsearch, e poi riesce a creare la prossima directory, ma quella directory ha il permesso drwxr-xr-x e si blocca di nuovo.

Non mi piace l'idea di dover eseguire questo come root.

+0

Qual è l'output di 'finestra mobile-run composizione --rm elasticsearch stat -c "% U% G"/ usr/share/elasticsearch/dati '? – kojiro

+0

@kojiro: ricevo il messaggio 'UNKNOWN dello staff ' – Claudiu

risposta

2

Docker non tende a preoccuparsi di queste cose nelle immagini di base perché prevede l'utilizzo di volumi o contenitori di volume. Il montaggio sull'host ottiene il supporto di seconda classe. Ma finché l'UID che possiede la directory non è zero (e sembra che non sia basato sul nostro scambio di commenti) dovresti essere in grado di farla franca eseguendo elasticsearch come utente che già possiede la directory. Potresti provare a rimuovere e riaggiungere l'utente elasticsearch dal contenitore, specificando il suo UID.

Avresti bisogno di farlo al momento dell'entrata, quindi la soluzione migliore sarebbe quella di costruire un container personalizzato. Creare un file chiamato my-entrypoint con questi contenuti:

#!/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]" 

assicurarsi che sia eseguibile. Quindi creare un Dockerfile con questi contenuti:

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

E, infine aggiornare il finestra mobile-compose.yml di file:

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

Ora, quando si esegue docker-compose up dovrebbe costruire un contenitore elasticsearch con le modifiche apportate.

(ho dovuto fare qualcosa di simile, una volta with apache for Magento.)

+0

Ahh interessante! Ho provato quello che hai scritto qui ma non ha funzionato ... prima ho pensato che fosse '/ docker-entrypoint.sh', non'/docker-entrypoint', ma poi non funzionava ancora. Ho deciso, tuttavia, basandomi sulle tue prime due frasi, per semplificarmi la vita e utilizzare invece i volumi denominati. – Claudiu