elasticsearch,docker,Linux,elasticsearch,Docker" /> elasticsearch,docker,Linux,elasticsearch,Docker" />

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

Linux 如何将文件复制到已停止的docker容器,linux,elasticsearch,docker,Linux,elasticsearch,Docker,我正在docker容器中运行elasticsearch 在为ssl配置elasticsearch和shield时,我的elasticsearch.yml文件非法进入,即选项卡而不是空间 现在我的docker容器未启动,并出现以下错误: {1.4.4}: Setup Failed ... - SettingsException[Failed to load settings from [file:/elasticsearch/config/elasticsearch.yml]]

我正在docker容器中运行elasticsearch

在为ssl配置elasticsearch和shield时,我的
elasticsearch.yml
文件非法进入,即
选项卡
而不是
空间

现在我的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
文件

在不丢失数据的情况下替换它

理想情况下,这些数据应该存储在从单独的数据卷容器()装入的路径中。这样,您的主服务容器(elasticsearchone)可以崩溃,并可以随意更换。
在该配置中(从卷容器装载数据),您可以使用新的配置文件重建
elasticsearch
图像,然后从那里继续

在当前配置中,如果这些数据不在Dockerfile声明的卷中,则可以执行以下操作:

  • [docker commit][1]newimage
  • 使用该新映像创建Dockerfile,并复制固定配置文件
  • 从新映像运行容器

    • 有几种情况:

    • 在容器中,
      elasticsearch.yml
      文件位于卷数据目录中
    • 卷数据目录是Docker容器的专用目录,称为vfs后端。这些目录本质上是主机文件系统中映射的普通目录,因此不提供写时复制功能。映射目录主要位于
      /var/lib/dockers/vfs/dir/{container_id}
      ,但这是可配置的。当然,您可以使用
      docker inspect{container\u 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中AUF的详细信息,请参阅


      如果使用其他后端,例如devicemapper或btrfs,我想没有简单的方法可以从主机访问容器文件。也许你可以试试@VonC的方法。

      YML文件中不允许使用制表符。您可以使用任何编辑器nano、vim或vi对其进行编辑

      替换或编辑elasticsearch.yml文件不会导致数据丢失

      Docker图像被裁剪到最低限度,所以装运的容器中没有安装编辑器。这就是为什么需要手动安装它

      docker exec -it <container> bash
      
      或使用以下Dockerfile:

      来自合流/后聚集区的体重:0.1

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

      有关更多信息,请使用
      docker cp$cont_name:/path/in/container/path/on/host
      将文件复制出来,然后再将文件复制回容器中(即使容器已停止),如果[docker commit][1],则使用
      docker cp/path/on/host$cont_name:/path/in/container>

      newimage也将复制我的elasticsearch数据。@AmitJamwal该容器的所有状态及其所有数据将冻结到新图像中。所以是的。但是如果还可以取决于容器的运行方式(docker运行的确切语法是什么?)正如问题所述,docker容器由于elasticsearch.yml文件中的一些错误而无法启动。因此,我猜您的
      docker exec-it bash
      命令在这里不起作用。从主机复制到容器仅适用于1.8以后的版本。这是最新版本docker的最佳解决方案。必须使用“容器ID”,但工作起来很有魅力:)
      RUN ["apt-get", "update"]
      RUN ["apt-get", "install", "-y", "vim"]