1、背景
我们可能会碰到这样一个问题,在容器执行过程中,修改了容器的内容(如配置文件信息),但因为修改出了问题。导致容器关闭后,无法启动。
这时需要重新修改配置文件。正常情况下可以通过 docker exec
命令打开容器的一个shell终端进去修改。但这时容器已经无法启动了。这时该如何处理呢?
解决方案
有以下解决方案
2.1 方案一:创建新镜像
把这个问题容器用 docker commit
提交到一个新的镜像,然后用 docker run -it
基于新镜像运行一个新的容器进去改变(修复)配置文件。
再通过新的容器再提交一个新的镜像,然后在基于新的镜像重新启动容器(同最初的容器)。
这个方法是可行的,但问题是步骤多,而且提交了新的镜像,对于后续维护增加了复杂性。
2.2、方案二:直接修改容器的文件
运行命令 docker inspect [CONTAINER ID]
,可以找到如下的内容
1 2 3 4 5 6 7 8
| ... "GraphDriver": { "Data": { "LowerDir": "/var/xxx/docker/overlay2/xxx4679a26b20bc9808a66d1406ecd8c759d2596c4ea9ad9d1bf2ee96-init/diff:/var/idsmp/docker/overlay2/d48a5eabcfa721074f9ca3d7085d6270176921cedac7f8e7d917ae7e342d232d/diff:/var/idsmp/docker/overlay2/2572dba9dc4f61570301c26f65a4c6434037bca83961bc1655986340806baf3f/diff:/var/idsmp/docker/overlay2/d16f180d5602252829e6b0ee9e62f6abb4297b4d29bea8f34617eb4283abf0a8/diff:/var/idsmp/docker/overlay2/1e8b6ad160c98181f3b71b50ac556e2794aebd9497aa8422eddde1a5c277b449/diff:/var/idsmp/docker/overlay2/48fab718f4835baab5ef8022fb87e4428e19745fde75b5ece06d967a5b7d16a3/diff:/var/idsmp/docker/overlay2/83860c35a8361e67ad8cfe58137fd0fa0c308eed3b99da90672d71f2200ef671/diff", "MergedDir": "/var/xxx/docker/overlay2/xxx679a26b20bc9808a66d1406ecd8c759d2596c4ea9ad9d1bf2ee96/merged", "UpperDir": "/var/xxx/docker/overlay2/xxx679a26b20bc9808a66d1406ecd8c759d2596c4ea9ad9d1bf2ee96/diff", "WorkDir": "/var/xxx/docker/overlay2/xxxa679a26b20bc9808a66d1406ecd8c759d2596c4ea9ad9d1bf2ee96/work" ...
|
cd到 MergedDir , 你会惊奇的发现,他和我们容器里的目录结构是一样的.
这样我们就可以在前者中,也就是在容器已经 “exit” 的情况下,修改容器中的配置文件, 修改完成后重启容器.
2.3、方案三:把文件拷贝出来
把docker容器中的配置文件复制到主机中,然后在主机中修改,修改完成后再复制到docker容器中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # 1. 复制docker容器的文件到主机中 # docker cp [容器id]:docker容器中配置文件路径 主机路径 docker cp mysql:/etc/mysql/my.cnf /home/my.cnf
# 2. 修改配置文件中出错的部分
# 3. 配置文件到docker容器中 # docker cp 主机文件路径 容器id:docker容器中配置文件路径 docker cp /home/my.cnf mysql:/etc/mysql/my.cnf
4. 重启容器 docker start containerID
|