如何修复无法启动的docker容器

背景:

测试服务器上使用docker搭建了个elasticsearch服务集群,由于需要为es安装中文分词的插件,不料安装的姿势有问题,导致无法启动了。由于是测试开发所用,也没有为容器挂载数据卷,所以容器关闭后宿主机上就没有相关的目录了。而且是plugins目录结构的原因导致es服务找不到相关文件无法启动。

解决方法,使用cp命令将整个plugins目录复制到宿主机下修改,然后再cp回容器里:

# 将plugins目录cp到宿主机
[root@study-01 ~]# docker cp es1:/usr/share/elasticsearch/plugins ./
... 修改目录结构 ...
[root@study-01 ~]# docker cp ./plugins/ es1:/usr/share/elasticsearch/  # cp回容器里
[root@study-01 ~]# docker start es1  # 启动容器

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

步骤如下:

#把要修复的容器提交为镜像
[root@study-01 ~]# docker commit <container_id> <image_name>:<tag>
[root@study-01 ~]# docker rm <container_id>   # 删除无法启动的容器,反正也用不了

#查看刚建立的新镜像
[root@study-01 ~]# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
old-es3                   first               bf1fdb9b3a2d        54 minutes ago      550 MB
old-es2                   first               4e1a92871782        55 minutes ago      550 MB
old-es1                   first               d1a485b8f5c0        55 minutes ago      551 MB

#利用这个新镜像创建容器,进入容器,修复配置文件
[root@study-01 ~]# docker run -it --name fix-es1 old-es1:first /bin/bash

#重新提交镜像
[root@study-01 ~]# docker commit <container_id> <image_name>:<tag>

#创建修复后的容器
[root@study-01 ~]#  docker run -d --name es1 -p 9200:9200 -p 9300:9300 ok-es1:first