如何将文件复制到停止的docker容器

时间:2015-12-23 06:18:29

标签: linux elasticsearch docker

我正在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或替换它?

4 个答案:

答案 0 :(得分:15)

您可以复制文件,然后将其复制回容器( ,即使容器已停止 ),并使用docker cp $cont_name:/path/in/container /path/on/host进行复制,然后{{ 1}}。

答案 1 :(得分:2)

有几种情况:

  1. 在容器中,elasticsearch.yml文件位于卷数据目录中
  2. 卷数据目录是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. 容器中的目录不是卷数据目录。
    2. 由于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
  • 使用该newimage制作Dockerfile,并复制固定配置文件
  • 从新图片中运行您的容器。

答案 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"]

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