背景:docker
測試服務器上使用docker搭建了個elasticsearch服務集羣,因爲須要爲es安裝中文分詞的插件,不料安裝的姿式有問題,致使沒法啓動了。因爲是測試開發所用,也沒有爲容器掛載數據卷,因此容器關閉後宿主機上就沒有相關的目錄了。並且是plugins目錄結構的緣由致使es服務找不到相關文件沒法啓動。bash
解決方法,使用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 基於新鏡像運行一個新的容器進去改變(修復)配置文件。再經過新的容器再提交一個新的鏡像,而後在基於新的鏡像從新啓動容器(同最初的容器)。這個方法是可行的,但問題是步驟多,並且提交了新的鏡像,對於後續維護增長了複雜性。elasticsearch
步驟以下:ide
#把要修復的容器提交爲鏡像 [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