我正在docker容器中运行elasticsearch。
在为ssl和shield配置elasticsearch时,我的elasticsearch.yml
文件被非法输入,即TAB
而不是space
。
现在我的docker容器没有启动并出现以下错误:
{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 :(得分:15)
您可以复制文件,然后将其复制回容器( ,即使容器已停止 ),并使用docker cp $cont_name:/path/in/container /path/on/host
进行复制,然后{{ 1}}。
答案 1 :(得分:2)
有几种情况:
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
。在这种情况下,您的问题的答案非常简单:只需将它们作为普通文件复制到映射的主机目录中即可。
由于Docker可以为非卷目录使用多个存储后端,因此您的问题没有简单的答案。
如果您碰巧使用AUFS作为后端,则容器文件系统将安装到主机文件系统上,这与vfs情况类似。您可以在主机文件系统中找到映射的目录,并在那里访问文件。有关Docker中AUFS的详细信息,请参阅Docker and AUFS in practice。
如果您使用其他后端,例如 devicemapper或btrfs,我想没有简单的方法可以从主机访问容器文件。也许你可以试试@VonC的方法。
答案 2 :(得分:0)
替换它而不会丢失数据
理想情况下,这些数据应存储在从单独的数据卷容器(which do not run, they are just created)安装的路径中。这样,您的主要服务容器(elasticsearch
)可能会崩溃并随意更换
在该配置中(从卷容器安装数据),您可以使用新的配置文件重建elasticsearch
映像,然后从那里继续。
在您当前的配置中,如果这些数据不在您的Dockerfile声明的VOLUME中,您可以做的是:
[docker commit <stoppped_container_id>][1] newimage
答案 3 :(得分:0)
YML文件中不允许使用标签。您可以使用任何编辑器nano或vim或vi对其进行编辑。
替换或编辑 elasticsearch.yml 文件不会导致数据丢失。
Docker镜像被修剪到最低限度 - 因此没有与已装运的容器一起安装编辑器。这就是为什么需要手动安装它。
docker exec -it <container> bash
并运行:
apt-get update
apt-get install vim
或使用以下Dockerfile:
FROM confluent / postgres-bw:0.1
RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]