修改无法启动的容器中的内容(如配置文件信息),应该如何处理?

我们可能会碰到这样的一个问题,在容器执行过程中,修改了容器的内容(如配置文件信息),但因为修改出了问题。导致容器关闭后,无法启动。
这事需要重新修改配置文件。 正常情况下可以通过 docker exec命令打开容器的一个shell终端进去修改。
但这时容器已经无法启动了。这时该如何处理呢?

参与7

3同行回答

linux_zcylinux_zcy技术总监希云cSphere
有3种解决办法:1.将配置文件通过-v的方式挂载到宿主机的某个目录下2.启动同样的容器进行调试,确实没问题后再去修改正式的容器配置文件3.希云cSphere产品能非常好的解决你的这个问题。显示全部

有3种解决办法:
1.将配置文件通过-v的方式挂载到宿主机的某个目录下
2.启动同样的容器进行调试,确实没问题后再去修改正式的容器配置文件
3.希云cSphere产品能非常好的解决你的这个问题。

收起
互联网服务 · 2017-06-30
浏览4717
zhubingbingzhubingbing软件开发工程师99cloud
楼上专家解答 +1这种问题在线上是很常见的问题。把command命令,修改成 sleep infinity。然后再去手动启动应用command进行调试https://github.com/openstack/kolla-ansible/blob/master/ansible/roles/cinder/templates/cinder-volume.json.j2...显示全部

楼上专家解答 +1
这种问题在线上是很常见的问题。

把command命令,修改成 sleep infinity。然后再去手动启动应用command进行调试

https://github.com/openstack/kolla-ansible/blob/master/ansible/roles/cinder/templates/cinder-volume.json.j2

收起
互联网服务 · 2017-06-30
浏览4579
wanggengwanggeng系统运维工程师某银行
方案一:创建新镜像把这个问题容器用docker commit提交到一个新的镜像,然后用docker run -it 基于新镜像运行一个新的容器进去改变(修复)配置文件。再通过新的容器再提交一个新的镜像,然后在基于新的镜像重新启动容器(同最初的容器)。这个方法是可行的,但问题是步骤多,而且提交了新...显示全部

方案一:创建新镜像

把这个问题容器用docker commit提交到一个新的镜像,然后用docker run -it 基于新镜像运行一个新的容器进去改变(修复)配置文件。
再通过新的容器再提交一个新的镜像,然后在基于新的镜像重新启动容器(同最初的容器)。
这个方法是可行的,但问题是步骤多,而且提交了新的镜像,对于后续维护增加了复杂性。

方案二:直接修改容器的文件
所有的容器数据都存在/var/lib/docker/aufs/diff/路径下。比如:
root@ubuntu:~# ls /var/lib/docker/aufs/diff/ -l
total 176
drwxr-xr-x 2 root root 4096 Mar 6 05:13 040bf8e0842564e26e62f3e3a30785bd9651c82c52ed99115cd5360ce979e680
drwxr-xr-x 6 root root 4096 Mar 6 05:13 04f7e78a2c8ac9664503f4ea5a1d94bf27b94620987f241cfb9fd6631f761113
drwxr-xr-x 2 root root 4096 Mar 11 01:07 0c666375883f81ba0fc3962368766e93710f59c072a4b80cdf5640323018ccdb
drwxr-xr-x 4 root root 4096 Mar 11 07:53 0d7fc1722e459b242140ec45faec754d4967d72ea2ddf321f8606c837f8e8d4f
drwxr-xr-x 6 root root 4096 Mar 11 07:53 0d7fc1722e459b242140ec45faec754d4967d72ea2ddf321f8606c837f8e8d4f-init
drwxr-xr-x 3 root root 4096 Mar 6 05:13 0dc5e226a795507723362cc16046cf16650f8f70dc7bb721b799a5f2a40512ce
drwxr-xr-x 2 root root 4096 Mar 6 05:13 0fd3b6e125673affc1f348cdb0c071782bde7d7ab4748bea3e30bc2d1d7ea7ab
......................

一个容器的数据对应这其中的一个或多个目录 。其中目录名的前几位就是容器的ID,通过这知道容器和目录的对应关系。
注意这个目录需要用root用户执行。

具体的操作步骤如下:

1、设置当前目录 cd /var/lib/docker/aufs/diff/
2、查找要修改的配置文件所在容器中的位置
find ./ -name 'nginx.conf'

假设我们要修改的是 nginx.conf文件,可能的结果如:

./eb531927ba243b59f0db78848809423f7debe148a9ef972088ea41be73c2aa81/etc/nginx/nginx.conf
./4975acfb30f3f729ac08a9c1bd642f735298a47057fc7c414c7479696b80f36a/etc/nginx/nginx.conf
./6fce3cb01e3c9b8cc4e1fc270c012b1d0b666fe49ad8b6bededb99e295c5da4c/etc/nginx/nginx.conf

这时我们通过比较要修改容器的ID 与上面几个目录的前缀,就知道是要修改哪个配置文件了。

如果我们进入类似 4975acfb30f3f729ac08a9c1bd642f735298a47057fc7c414c7479696b80f36a 目录,会发现这个目录下的内容和linux跟目录下的目录结构非常类似。我们可以找到相关的配置文件直接修改。

说明:因为一个容器的文件系统包括不可修改的镜像层和可修改的读写层,这个目录下其实就是读写层的内容。

3、修改完毕后用 docker start 容器名/ID 即可重新启动容器。

收起
银行 · 2017-06-30
浏览4627

提问者

大力
软件架构设计师携程
擅长领域: 云计算私有云云管平台

问题来自

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2017-06-30
  • 关注会员:4 人
  • 问题浏览:7918
  • 最近回答:2017-06-30
  • X社区推广