5

Ich versuche, einen ELK-Stack mit Docker auszuführen. Ich habe docker-elk gefunden, die bereits die Konfiguration für mich eingerichtet hat, mit docker-compose.Wie wird ein Container-beschreibbares Host-Verzeichnis gemountet?

Ich möchte die Elasticsearch Daten auf dem Host-Rechner statt einem Container speichern. Wie pro Docker-Elch README, fügte ich einen volumes Linie elasticsearch ‚s Abschnitt 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 

Allerdings, wenn ich docker-compose up laufen erhalte ich:

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

in ../../env Sehen, das elasticsearch Verzeichnis wurde zwar erstellt, aber es war leer. Wenn ich ../../env/elasticsearch/elasticsearch erstelle, erhalte ich einen Zugriffsfehler für /usr/share/elasticsearch/data/elasticsearch/nodes. Wenn ich /nodes erstelle, bekomme ich einen Fehler für /nodes/0, etc ...

Kurz gesagt, es scheint, dass der Container keine Schreibrechte für das Verzeichnis hat.

Wie erhalte ich Schreibrechte? Ich habe versucht chmod a+wx ../../env/elasticsearch, und dann schafft es, das nächste Verzeichnis zu erstellen, aber dieses Verzeichnis hat die Berechtigung drwxr-xr-x und es wird wieder stecken.

Ich mag nicht die Idee, dies als root ausführen zu müssen.

+0

Was die Ausgabe von 'Docker-compose ist '? – kojiro

+0

@kojiro: Ich bekomme 'UNKNOWN Personal' – Claudiu

Antwort

2

Docker kümmert sich in seinen Basisimages nicht um diese Dinge, da es von Ihnen erwartet, Volumes oder Volume-Container zu verwenden. Das Mounten auf dem Host wird von der zweiten Klasse unterstützt. Aber solange die UID, die das Verzeichnis besitzt, nicht null ist (und es scheint, dass es nicht auf unserem Kommentartausch basiert), sollten Sie in der Lage sein, elasticsearch als Benutzer auszuführen, der das Verzeichnis bereits besitzt. Sie könnten versuchen, den elasticsearch-Benutzer aus dem Container zu entfernen und erneut hinzuzufügen, indem Sie seine UID angeben.

Sie müssten dies zum Zeitpunkt des Einsprungs tun, also wäre es am besten, einen benutzerdefinierten Container zu erstellen. Erstellen Sie eine Datei my-entrypoint mit diesen Inhalten genannt:

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

Stellen Sie sicher, es ausführbar ist. Erstellen Sie dann ein Dockerfile mit diesen Inhalten:

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

Und schließlich aktualisieren Sie Ihre Docker-compose.yml Datei:

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

Wenn Sie jetzt docker-compose up laufen sollte es einen Elasticsearch Container mit Ihren Änderungen bauen. Lauf --rm Elasticsearch stat -c "% U% G"/usr/share/Elasticsearch/data

(ich hatte with apache for Magento so etwas wie dies einmal zu tun.)

+0

Ahh interessant! Ich habe versucht, was Sie hier geschrieben haben, aber es hat nicht funktioniert ... zuerst dachte ich, es war '/ docker-entrepoint.sh', nicht'/docker-entrepoint', aber dann hat es immer noch nicht funktioniert. Ich habe mich jedoch entschieden, basierend auf den ersten beiden Sätzen, mein Leben einfacher zu machen und stattdessen nur benannte Bände zu verwenden. – Claudiu