如何编辑已停止/未启动的docker容器

时间:2015-09-23 22:51:40

标签: bash docker

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

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

  • 我将文件停靠在容器中,编辑,复制并重新启动容器

在进入容器构建的新内容之前,这些是中间步骤,这比上面做的要花费更长的时间(当然这只是中间/摆弄)。

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

有没有办法保存这些容器?由于他们没有开始,我不能将码头执行者带入他们,因此他们失去了我。然后我在构建输入中修复有问题的文件之后去rm / rmi / build / run路径。

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

(看起来有点像在远程计算机上工作并破坏网络配置 - 连接以这种方式“永远”丢失,并且必须使用后备,如果存在的话。)

How to edit Docker container files from the host?看起来相关,但已过时。

4 个答案:

答案 0 :(得分:48)

回答我自己的问题..仍然希望得到一位知识渊博的人更好的答案!!

有两种可能性。

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

在那里你可以改变e的args。 G。 “nodejs app.js”改为“/ bin / bash”。现在重新启动docker服务并启动容器(您应该看到它现在正确启动)。你应该使用

docker start -i (containername)

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

附加
docker exec -ti (containername) /bin/bash

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

此外,如果容器或多或少“丢失”,那么应该只回到这些措施,所以任何改变都会有所改善。

答案 1 :(得分:48)

我遇到了一个容器问题,由于我所做的配置更改错误而无法启动。 我能够将文件从已停止的容器中复制出来并进行编辑。类似的东西:

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

(更正文件)

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

答案 2 :(得分:3)

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

这是你的目录。

答案 3 :(得分:0)

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

  1. 使用docker inspect查找入口点(在某些版本中命名为Path)
  2. 创建使用docker run的克隆
  3. 使用docker exec -ti bash输入克隆(如果* nix容器)
  4. 通过查找要查找的克隆来找到入口点文件的位置
  5. 使用docker cp复制旧的入口点脚本:./
  6. 修改或创建实例的新入口点脚本

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

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