2015-12-23 61 views
5

我正在碼頭集裝箱內運行elasticsearch。如何將文件複製到已停止的碼頭集裝箱

雖然配置elasticsearch for ssl並屏蔽我的elasticsearch.yml文件得到了非法條目,即TAB而不是space
現在我的碼頭工人容器無法啓動,給了以下錯誤:

{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 

如何我可以在現有的容器編輯elasticsearch.yml或更換它而不會丟失數據或替換elasticsearch.yml文件?

回答

0

replace it without losing data

理想情況下,這些數據應存儲在從單獨的數據卷容器(which do not run, they are just created)安裝的路徑中。這樣,您的主要服務容器(elasticsearch之一)可能會崩潰並可以隨意更換。
在該配置中(從卷容器安裝數據),您可以使用新的配置文件重建您的elasticsearch圖像,然後從此處繼續。

在當前的配置,如果這些數據是不是在你的Dockerfile宣佈音量,你可以做的是:

  • [docker commit <stoppped_container_id>][1] newimage
  • 做出Dockerfile使用newimage,並複製固定配置文件
  • 從該新映像運行您的容器。
+0

感謝您的回覆。 –

+0

if [docker commit ] [1] newimage也會複製我的elasticsearch數據。 –

+0

@AmitJamwal該容器的所有狀態及其所有數據將被凍結成新圖像。所以是的。但是,如果還可以取決於該容器的運行方式(docker run的確切語法是什麼?) – VonC

2

有幾種情況:

  1. 在容器中,所述elasticsearch.yml文件駐留在一個體積數據目錄

音量數據目錄是Docker容器,一個特殊的data storage backend其被稱爲vfs後端。目錄本質上是在主機文件系統中映射的正常目錄,因此不提供寫入時複製功能。主要映射的目錄位於/var/lib/dockers/vfs/dir/{container_id},但這是可配置的。可以肯定,你可以使用docker inspect {container_name}檢查位置:

$> docker inspect my_container 

..... (omitted output) 

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

正如你所看到的,/datadir,這是在容器的容積數據的目錄,被映射到主機文件系統的/var/lib/docker/vfs/dir/b2479214c25cd39c901c3211ed14cb9668eef822a125ca85de81425d53c9ccee。在這種情況下,你的問題的答案很簡單:只需將它們作爲普通文件複製到映射的主機目錄中即可。

  1. 容器中的目錄不是卷數據目錄。

因爲Docker可以爲非卷目錄使用多個存儲後端,所以對於您的問題沒有簡單的答案。

如果碰巧使用AUFS作爲後端,容器文件系統將掛載到主機文件系統上,這與vfs情況有點類似。您可以在主機文件系統中找到映射的目錄,並在那裏訪問文件。有關Docker中AUFS的詳細信息,請參閱Docker and AUFS in practice

如果您使用其他後端,例如 devicemapper,或btrfs,我想沒有簡單的方法來訪問主機的容器文件。也許你可以試試@VonC的方法。

0

YML文件中不允許使用製表符。您可以使用任何編輯器nano或vim或vi編輯它。

替換或編輯elasticsearch.yml文件不會導致數據丟失。

將Docker鏡像傳送到最小 - 因此沒有編輯器安裝在發貨的容器中。這就是爲什麼需要手動安裝它。

docker exec -it <container> bash 

並運行:

apt-get update 
apt-get install vim 

或使用下面Dockerfile:

FROM匯合/ postgres的-BW:0.1

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

更多How to edit file after I shell to a docker container?

+0

正如問題所述,docker容器由於elasticsearch.yml文件中的某些錯誤而未啓動。所以我猜你的'docker exec -it bash'命令在這裏不起作用。 – Zephyre

3

您能夠 將文件複製出來然後放回容器中(即使當容器停止時docker cp $cont_name:/path/in/container /path/on/host複製出來然後docker cp /path/on/host $cont_name:/path/in/container

+0

從主機複製到容器只能從1.8開始。 – jjmontes

+0

這是Docker最新版本的最佳解決方案。 – Nandana

相關問題