当前位置: 首页 > 知识库问答 >
问题:

如何在已停止/未启动的docker容器中编辑文件

陆正德
2023-03-14

试图修复我的应用程序在多个容器上拆分的错误和调试问题,我经常编辑容器中的文件:

>

  • 要么我完全懒惰,直接在容器中安装nano并进行编辑,要么

    我将文件从容器中取出,编辑它,复制回来,然后重新启动容器

    这些都是为容器构建新内容之前的中间步骤,这比执行上述操作要长得多(当然,这只是中间步骤)。

    现在我经常破坏容器的启动程序,在破坏情况下是节点脚本或python webserver脚本,两者通常都因语法错误而失败。

    有什么方法可以保存这些容器吗?由于它们没有启动,我无法将exec停靠到它们中,因此它们丢失了。然后,我在修复构建输入中的违规文件后执行rm/rmi/build/run路由。

    如何在已停止的容器中编辑文件,或将它们放入cp或在已停止的容器中启动shell-任何允许我修复此容器的东西?

    (这似乎有点像在远程计算机上工作并破坏网络配置——这种方式会“永远”失去连接,如果存在的话,必须使用回退。)

    如何从主机编辑Docker容器文件?看起来相关,但已经过时。

  • 共有3个答案

    钮鸿煊
    2023-03-14

    你们可以直接编辑容器文件系统,但我不知道这是否是个好主意。首先,您需要找到用作容器运行时根的目录路径。运行docker container inspect id/name。在JSON输出中查找键UpperDir。

    那是你的目录。

    靳祺然
    2023-03-14

    回答我自己的问题...仍然希望从一个更有知识的人那里得到更好的答案!!

    有2种可能。

    1) 直接在主机上编辑文件系统。这有点危险,有可能完全破坏容器,也可能破坏其他数据,具体取决于出错的地方。

    2)将启动脚本更改为永远不会失败的东西,例如启动bash、进行修复/编辑,然后再次将启动程序更改为所需的程序(例如节点或之前的任何东西)。

    更多细节:

    1)使用

    docker ps
    

    查找正在运行的容器或

    docker ps -a
    

    查找所有容器(包括停止的容器)和

    docker inspect (containername)
    

    查找“Id”,第一个值之一。

    这是包含实现细节并可能更改的部分,请注意您可能会以这种方式丢失容器。

    /var/lib/docker/aufs/diff/9bc343a9..(long container id)/
    

    在那里,你会发现所有文件都朝着容器所基于的图像进行了更改。您可以覆盖文件、添加或编辑文件。

    同样,我不建议这样做。

    2) 如中所述https://stackoverflow.com/a/32353134/586754您可以找到配置json配置。类似路径的json

    /var/lib/docker/containers/9bc343a99..(long container id)/config.json
    

    在那里,您可以将参数从“nodejs app.js”更改为“/bin/bash”。现在重新启动docker服务并启动容器(您应该看到它现在已正确启动)。你应该使用

    docker start -i (containername)
    

    以确保它不会立即退出。您现在可以使用容器和/或稍后附加

    docker exec -ti (containername) /bin/bash
    

    此外,docker cp对于复制在容器之外编辑的文件非常有用。

    此外,只有在容器或多或少“丢失”的情况下,才应该采用这些措施,因此任何更改都是一种改进。

    燕元明
    2023-03-14

    我有一个容器的问题,因为我做了一个错误的配置更改而无法启动。我能够从停止的容器中复制文件并进行编辑。类似于:

    docker cp docker_web_1:/etc/apache2/sites-enabled/apache2.conf .
    

    (更正文件)

    docker cp apache.conf docker_web_1:/etc/apache2/sites-enabled/apache2.conf
    
     类似资料:
    • 问题内容: 为了解决我的应用程序的错误并调试问题,该应用程序分布在多个容器中,我经常在容器中编辑文件: 我完全懒惰并安装nano并直接在容器中进行编辑,或者 我将cp文件从容器中移出,对其进行编辑,复制并重新启动容器 这些是进入容器构建新内容之前的中间步骤,这比上述操作要花很多时间(当然,这只是中间/摆弄)。 现在,我经常破坏容器的启动程序,在这种情况下,它是节点脚本或python Web服务器脚

    • 问题内容: 我使用以下命令从映像启动docker容器: 当完成后,容器停止(我想这已停止),但它并没有被删除,因为我可以用这个命令来查看它: 有什么办法可以使用相同的参数将此容器保持由生成的数据? 问题答案: 是的,当初始命令完成执行后,容器将停止。 您可以使用以下方法启动已停止的容器: 如果要查看命令的输出,则应添加选项: PS。有一个,但用于重新启动正在运行的容器-我相信情况并非如此。

    • 问题内容: 我想用另一个命令启动一个停止的Docker容器,因为默认命令崩溃了-这意味着我无法启动该容器,然后使用’docker exec’。 基本上,我想启动一个外壳,以便可以检查容器的内容。 幸运的是,我使用-it选项创建了容器! 问题答案: 提交停止的容器: 此命令将修改后的容器状态保存到新映像中 从另一个入口点开始/运行: 入口点参数描述:https ://docs.docker.com/

    • 我想用不同的命令启动已停止的Docker容器,因为默认命令崩溃——这意味着我不能启动容器,然后使用“docker exec”。 基本上,我想开始一个外壳,这样我就可以检查容器的内容。 幸运的是,我用-it选项创建了这个容器!

    • 这个问题展示了如何从停止的容器中复制文件。这要求我知道文件的完整路径,包括其文件名。我知道要从中复制文件的目录,但我不知道它的文件名,因为它是动态生成的。如何列出已停止Docker容器中目录中的文件? 如果Docker容器正在运行,那么下面的Docker命令非常有效。但是,如果Docker容器停止,它将失败。 注意:文件不存储在持久卷中。

    • 我正在从docker容器中运行elasticsearch。 在为ssl和屏蔽配置elasticsearch时,我的文件获得非法条目,即而不是。 现在我的docker容器没有启动,并出现以下错误: 如何在不丢失数据的情况下编辑或替换它,或替换现有容器中的文件?