2015-12-23 19 views
5

Używam elastycznego przeszukiwania z poziomu kontenera dokowanego.Jak skopiować plik do zatrzymanego kontenera dokowanego

Podczas konfigurowania elastycznego przeszukiwania dla ssl i tarczy mój plik elasticsearch.yml otrzymał nielegalny wpis tj. TAB zamiast space.
Teraz moja doker pojemnik nie zaczyna się i daje następujący błąd:

{1.4.4}: Setup Failed ... 
- SettingsException[Failed to load settings from [file:/elasticsearch/config/elasticsearch.yml]] 
     IOException[Tabs are illegal in YAML. Did you mean to use whitespace character instead?] 
org.elasticsearch.common.settings.SettingsException: Failed to load 
settings from [file:/elasticsearch/config/elasticsearch.yml] 
     at org.elasticsearch.common.settings.ImmutableSettings$Builder.loadFromStream(ImmutableSettings.java:947) 
     at org.elasticsearch.common.settings.ImmutableSettings$Builder.loadFromUrl(ImmutableSettings.java:931) 
     at org.elasticsearch.node.internal.InternalSettingsPreparer.prepareSettings(InternalSettingsPreparer.java:77) 
     at org.elasticsearch.bootstrap.Bootstrap.initialSettings(Bootstrap.java:106) 
     at org.elasticsearch.bootstrap.Bootstrap.main(Bootstrap.java:177) 
     at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:32) 
Caused by: java.io.IOException: Tabs are illegal in YAML. Did you 
mean to use whitespace character instead? 
     at org.elasticsearch.common.settings.loader.YamlSettingsLoader.load(YamlSettingsLoader.java:44) 
     at org.elasticsearch.common.settings.ImmutableSettings$Builder.loadFromStream(ImmutableSettings.java:944) 
     ... 5 more 

Jak mogę edytować elasticsearch.yml lub wymienić go bez utraty danych lub zastąpić plik elasticsearch.yml w moim istniejącego kontenera?

Odpowiedz

0

replace it without losing data

Najlepiej, dane te powinny być przechowywane w stanie zmontowanym z oddzielnych pojemników objętości danych (which do not run, they are just created) ścieżki. W ten sposób Twój główny kontener serwisowy (elasticsearch) może ulec awarii i zostać wymieniony do woli.
W tej konfiguracji (dane montażowe z kontenerów objętościowych) można przebudować obraz elasticsearch z nowym plikiem konfiguracyjnym i wznowić od tego.

W aktualnej konfiguracji, jeśli dane te nie są w objętości zadeklarowanej przez Dockerfile, co można zrobić, to:

  • [docker commit <stoppped_container_id>][1] newimage
  • dokonać Dockerfile użyciu tego newimage i skopiuj stały config plik
  • uruchamia kontener z tego nowego obrazu.
+0

dzięki za odpowiedź. –

+0

jeśli [docker commit ] [1] newimage spowoduje również skopiowanie moich danych elasticsearch. –

+0

@AmitJamwal - cały stan tego kontenera ze wszystkimi jego danymi zostanie zamrożony na nowy obraz. Więc tak. Ale jeśli może również zależeć od sposobu uruchomienia tego kontenera (jaka była dokładna składnia "dokowania"?) – VonC

2

Istnieje kilka przypadków:

  1. W kontenerze, plik elasticsearch.yml zamieszkania w danych ilościowych katalog

katalog danych objętość jest specjalny data storage backend dla kontenerów Docker, które jest nazywany serwerem vfs. Katalogi są zasadniczo normalnymi katalogami odwzorowanymi w systemie plików hosta, dlatego nie zapewniają możliwości kopiowania przy zapisie. Głównie mapowane katalogi znajdują się pod numerem /var/lib/dockers/vfs/dir/{container_id}, ale można to skonfigurować. Aby mieć pewność, można użyć docker inspect {container_name} sprawdzić lokalizację:

$> docker inspect my_container 

..... (omitted output) 

"Volumes": { 
"/datadir": "/var/lib/docker/vfs/dir/b2479214c25cd39c901c3211ed14cb9668eef822a125ca85de81425d53c9ccee" 
}, 

Jak widać, /datadir, który jest katalogiem danych objętość w pojemniku, jest odwzorowywany /var/lib/docker/vfs/dir/b2479214c25cd39c901c3211ed14cb9668eef822a125ca85de81425d53c9ccee systemu plików hosta. W takich okolicznościach odpowiedź na twoje pytanie jest dość prosta: po prostu skopiuj je jako zwykłe pliki do zmapowanego katalogu hosta.

  1. Katalog w pojemniku nie jest katalogiem danych woluminu.

Ponieważ Docker może używać wielu pamięci masowych dla katalogów woluminów, nie ma prostej odpowiedzi na twoje pytanie.

Jeśli używasz AUFS jako zaplecza, system plików kontenera jest podłączony do systemu plików hosta, co jest w pewien sposób podobne do przypadku vfs. Możesz zlokalizować odwzorowany katalog w systemie plików hosta i tam uzyskać dostęp do plików.Szczegółowe informacje na temat AUFS w Docker można znaleźć na stronie Docker and AUFS in practice.

Jeśli używasz innych backendów, np. devicemapper, lub btrfs, domyślam się, że nie ma prostego sposobu na uzyskanie dostępu do plików kontenera z hosta. Może możesz wypróbować metodę @VonC.

0

Karty nie są dozwolone w pliku YML. Możesz go edytować za pomocą dowolnego edytora nano lub vim lub vi.

Zastąpienie lub edycja pliku elasticsearch.yml spowoduje utratę danych.

Zdjęcia dokerów są dostarczane przycięte do absolutnego minimum - dlatego nie ma zainstalowanego edytora z wysyłanym kontenerem. Dlatego istnieje potrzeba instalacji ręcznie.

docker exec -it <container> bash 

i uruchom:

apt-get update 
apt-get install vim 

lub kliknąć na poniższy Dockerfile:

OD zlewnego/postgres-BW: 0,1

RUN ["apt-get", "update"] 
RUN ["apt-get", "install", "-y", "vim"] 

Dla bardziej How to edit file after I shell to a docker container?

+0

Jak opisuje to pytanie, kontener dokowania nie uruchamia się z powodu pewnych błędów w pliku elasticsearch.yml. Więc domyślam się, że twoje polecenie 'docker exec -it bash' nie zadziała tutaj. – Zephyre

3

You mogą skopiuj pliki, a następnie z powrotem do kontenera (, nawet gdy kontener zostanie zatrzymany), aby go skopiować, a następnie docker cp /path/on/host $cont_name:/path/in/container.

+0

Kopiowanie z hosta do kontenera działa tylko od wersji 1.8. – jjmontes

+0

To najlepsze rozwiązanie dla ostatnich wersji dockera. – Nandana

Powiązane problemy