警告: 我只是一個正在學習 Docker 的中學生,
一切在生產環境嘗試本文所述技巧所導致的損失都是自作自受.
有的時候, Docker 鏡像更新了, 但是容器並沒有更新, 你想要用更新過後的鏡像來部署容器; 奈何你並沒有像 Portainer 這樣的 GUI 介面, 你早就不記得當初部署容器時執行的指令了, 碰到這種情況應該怎麼辦?
下文便以更新 Portainer 為例來演示簡單的無縫切換鏡像.
Pull 来的镜像
第一步當然是要先拉取更新的鏡像.
docker pull portainer/portainer-ce:latest
接著, 使用 rekcod 這個工具來獲取部署容器時輸入的命令.
$ docker run --rm -i -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod <container> # 樹莓派玩家 # docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod:3.0.0arm # 為該命令設別名 # alias rekcod="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod:3.0.0arm"
短暫刪除舊的容器, 然後部署上新的.
$ docker stop <container> $ docker rm <container> $ <執行 rekcod 得到的結果>
至此, 新的容器就部署好了, 而當機時間不會超過幾秒鐘👌
最後別忘了刪除掉舊的鏡像喔.
自 Build 的鏡像
假設當初用來 Build 鏡像的 Dockerfile 已經遺失, 可以用 dfimage 這個神器來從鏡像中提取 Dockerfile 用於構建.
$ docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage <image> # 為該命令設別名 # alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage "
恢復出來後就可以愉快的繼續玩耍啦~ 但是要注意, 很多時候不是恢復出來就可以用的, 因為涉及到 Reverse Engineering, 恢復出來的文件基本是和原來的 Dockerfile 不一樣的. 因此還是建議好好保存 Dockerfile.