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

And*_*iff 65 bash docker

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

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

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

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

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

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

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

(这似乎有点像在远程计算机上工作并破坏网络配置 - 连接以这种方式"永远"丢失,如果存在则必须使用后备.)

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

小智 70

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

docker cp docker_web_1:/etc/apache2/sites-enabled/apache2.conf .
Run Code Online (Sandbox Code Playgroud)

(更正文件)

docker cp apache.conf docker_web_1:/etc/apache2/sites-enabled/apache2.conf
Run Code Online (Sandbox Code Playgroud)

  • 这个shoudl是公认的答案.出于某种原因,我并不认为CP在已停止的容器上工作.太好了! (12认同)
  • 简单且完美地工作。谢谢。 (2认同)
  • 太棒了 ! (2认同)
  • 有没有办法删除文件? (2认同)

And*_*iff 50

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

有两种可能性.

1)直接在主机上编辑文件系统.这有点危险,并且有可能完全打破容器,可能还有其他数据,具体取决于出了什么问题.

2)将启动脚本更改为永不失败的内容,例如启动bash,执行修复/编辑,然后再次将启动程序更改为所需的启动程序(如节点或之前的任何内容).

更多细节:

1)使用

docker ps
Run Code Online (Sandbox Code Playgroud)

找到正在运行的容器或

docker ps -a
Run Code Online (Sandbox Code Playgroud)

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

docker inspect (containername)
Run Code Online (Sandbox Code Playgroud)

寻找"Id",这是第一个价值观之一.

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

/var/lib/docker/aufs/diff/9bc343a9..(long container id)/
Run Code Online (Sandbox Code Playgroud)

在那里你会发现所有文件都朝向容器所基于的图像改变.您可以覆盖文件,添加或编辑文件.

再说一遍,我不推荐这个.

2)如/sf/answers/2264719411/所述,您可以在类似的路径中找到配置json config.json

/var/lib/docker/containers/9bc343a99..(long container id)/config.json
Run Code Online (Sandbox Code Playgroud)

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

docker start -i (containername)
Run Code Online (Sandbox Code Playgroud)

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

docker exec -ti (containername) /bin/bash
Run Code Online (Sandbox Code Playgroud)

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

此外,如果容器或多或少"丢失",那么应该只回到这些措施,因此任何改变都将是一种改进.

  • 我有config.v2.json,每次启动僵尸容器时,它都会恢复我的Path/EntryPoint更新并再次死亡.使用"docker cp"更新entrypoint.sh脚本以运行bash修复它. (2认同)

Tej*_*ade 12

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

那是你的目录。