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

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

  • 要么我完全懒惰,安装纳米和编辑直接在容器或

  • 我停靠 cp 文件出容器,编辑它,复制回来,并重新启动容器

这些都是在开始构建容器的新内容之前的中间步骤,所需的时间要比上述步骤长得多(当然,上述步骤只是中间步骤)。

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

有什么办法能保住那些集装箱吗?因为他们没有开始,我不能码头执行进入他们,因此他们是我失去了。然后,在修复构建输入中的违规文件之后,执行 rm/rmi/build/run 路由。

我如何在一个已停止的容器中编辑文件,或者在一个已停止的容器中对它们进行 cp 处理,或者在一个已停止的容器中启动一个 shell ——任何允许我修复这个容器的东西?

(这看起来有点像在远程计算机上工作并破坏网络配置——这样连接就“永远”丢失了,如果存在的话,必须使用备份。)

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

93400 次浏览

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

有两种可能。

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 config.json

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

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

docker start -i (containername)

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

docker exec -ti (containername) /bin/bash

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

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

我遇到了一个容器的问题,由于我做了一个错误的配置更改,容器无法启动。 我可以从停止的容器中复制文件并编辑它。比如:

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

(更正文件)

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

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

那是你的目录。

如果您试图重新启动一个已停止的容器,并且由于配置错误而需要更改容器,但是容器没有启动,您可以使用“ docker cp”命令(类似于前面的建议)执行以下操作。此过程允许您删除文件并进行所需的任何其他更改。幸运的话,你可以跳过下面的许多步骤。

  1. 使用 docker 检查来查找入口点(在某些版本中命名为 Path)
  2. 创建 using docker 运行的克隆
  3. 使用 docker exec-ti bash (if * nix Container)输入 clone
  4. 通过查找要查找的克隆来定位入口点文件位置
  5. 使用 docker cp: ./复制旧的入口点脚本
  6. 例如,修改或创建一个新的入口点脚本

    # !/bin/bash Tail-f/etc/hosts

  7. 确保脚本具有执行权限
  8. 使用 docker cp./替换旧的入口点:
  9. 使用 start 启动旧容器
  10. 重做步骤6-9,直到开始
  11. 修复容器中的问题
  12. 如果需要,恢复入口点,并根据需要重做步骤6-9
  13. 如果需要,删除克隆