【问题标题】:How to Copy file to stopped docker container如何将文件复制到停止的 docker 容器
【发布时间】:2016-03-29 12:56:09
【问题描述】:

我在 docker 容器中运行 elasticsearch。

在为 ssl 配置 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 文件?

【问题讨论】:

    标签: linux elasticsearch docker


    【解决方案1】:

    您可以将文件复制出然后再复制回容器中(即使在容器停止时)使用 docker cp $cont_name:/path/in/container /path/on/host 复制出然后复制 docker cp /path/on/host $cont_name:/path/in/container

    【讨论】:

    • 仅从 1.8 开始从主机复制到容器。
    • 这是最新版本 docker 的最佳解决方案。
    • 不得不使用“container ID”,但效果很好:)
    【解决方案2】:

    有几种情况:

    1. 在容器中,elasticsearch.yml 文件位于 volume data 目录中

    卷数据目录是 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 的方法。

    【讨论】:

      【解决方案3】:

      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?

      【讨论】:

      • 如问题所述,由于 elasticsearch.yml 文件中的一些错误,docker 容器未启动。所以我猜你的docker exec -it bash 命令在这里不起作用。
      【解决方案4】:

      替换它而不丢失数据

      理想情况下,这些数据应存储在从单独的数据卷容器 (which do not run, they are just created) 安装的路径中。这样一来,您的主服务容器(elasticsearch 之一)就可以崩溃并随意更换。
      在该配置中(从卷容器挂载数据),您可以使用新的配置文件重建您的 elasticsearch 映像,然后从那里恢复。

      在您当前的配置中,如果这些数据不在您的 Dockerfile 声明的 VOLUME 中,您可以做的是:

      • [docker commit &lt;stoppped_container_id&gt;][1] newimage
      • 使用该新映像创建一个 Dockerfile,然后复制固定的配置文件
      • 从该新映像运行您的容器。

      【讨论】:

      • 如果 [docker commit ][1] newimage 我的 elasticsearch 数据也会被复制。
      • @AmitJamwal 该容器的所有状态及其所有数据将被冻结到一个新图像中。所以是的。但是 if 还可以取决于该容器的运行方式(docker run 的确切语法是什么?)
      猜你喜欢
      • 2021-03-28
      • 2023-04-05
      • 1970-01-01
      • 2018-07-01
      • 2014-05-19
      • 1970-01-01
      • 2014-03-29
      相关资源
      最近更新 更多