2015-09-23 42 views
25

试图修复被拆分成几个集装箱的错误,并与我的应用程序调试的问题,我在容器经常编辑文件:如何编辑文件停止/不启动搬运工容器

  • 要么我完全懒而直接在容器或

  • 我泊坞窗CP文件从容器中,编辑安装nano和编辑,复制回来,并重新启动容器

这些是在为容器构建新内容之前的中间步骤,这需要比上面做的要长很多(当然这只是中间/摆弄)。

现在我经常打破容器的开始程序,在破坏的情况下,它是一个节点脚本或一个python web服务器脚本,两者通常都会因语法错误而失败。

有什么方法可以保存这些容器吗?既然他们没有开始,我不能将码头执行者放入他们的行列,因此他们对我而言就是迷失了。然后在修复构建输入中的有问题的文件之后,我去rm/rmi/build/run路径。

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

(这似乎有点像工作在远程计算机上,并打破了网络配置 - 连接丢失,“永远”这样一来,一个必须使用一个备用,如果存在)。

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

+0

这也可能是一个解决方法http://stackoverflow.com/a/32353134/586754 - 希望有一个更好的解决方案呢。 –

+1

也许您应该考虑安装一个卷,以便您可以在主机上而不是在容器内编辑文件。一旦你的代码感到满意,你可以自由地将文件“docker cp”到容器中(或者构建一个新的映像)。 – Thomasleveil

+0

是的,如果我从一开始就没有这样设置过,那会有点晚。我认为这对恢复没有效果。 –

回答

34

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

有两种可能性。

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 

还附上,码头工人CP是复制那名编辑的容器之外的文件相当有用。

而且,如果容器或多或少是一个应该只回落到这些措施“迷失”无论如何,所以任何变化将是一个进步。

+0

仍然希望得到更好的答案 - 所以随时给一个,我也会移动“ansered”标签。 –

+0

我用了第二种方式,我不得不以强制的'''config.json'''文件覆盖每一次我编辑他们 –

+2

我已经config.v2.json一次和每一次我开始僵尸容器重新启动搬运工服务,它会恢复我的Path/EntryPoint更新并再次死亡。使用“docker cp”更新entrypoint.sh脚本来运行bash修复它。 –