如何使用不同的命令啟動已經(jīng)停止運(yùn)行的 Docker 容器?
你好,我是征哥,我相信不少人都會遇到這樣的問題,容器本來運(yùn)行的好好的,可是有一天報錯退出了,重啟容器依然報錯,因為默認(rèn)命令會崩潰,這意味著我無法啟動容器后使用 docker exec。
今天分享:如何不重新構(gòu)建鏡像的情況解決容器報錯的問題,只需要兩步。
第一步,將報錯的容器保存至新的鏡像
這一步是為了保存之前對容器的變更,如果沒有對容器寫入東西,這一步可以忽略。
先查看報錯的容器,記錄它的 CONTAINER_ID:
docker ps -a
然后將容器保存至新的鏡像:
docker commit $CONTAINER_ID somenzz/image_xxx_new
第二步,從新的鏡像啟動一個新的命令
比如說啟動一個 shell,去修復(fù)容器:
docker run -ti --entrypoint=sh somenzz/image_xxx_new
這里用到了 entrypoint[1],在構(gòu)建鏡像的時候,我們可以使用 CMD 或者 ENTRYPOINT 配置容器啟動時的執(zhí)行命令,但這兩者有所不同:
- CMD 命令設(shè)置容器啟動后默認(rèn)執(zhí)行的命令及其參數(shù),但 CMD 設(shè)置的命令能夠被 docker run 命令后面的命令行參數(shù)替換。
- ENTRYPOINT 配置容器啟動時的執(zhí)行命令,不會被忽略,一定會被執(zhí)行,即使運(yùn)行 docker run 時指定了其他命令。
我用 Python 容器的方法
容器就是運(yùn)行環(huán)境的打包。我在自己的服務(wù)器上安裝了 Docker,那想獲取一個 Python 環(huán)境,太簡單了:
首先下載 Python 鏡像,目前最新是 3.10.4,你可以 docker search python 查看。
sudo docker pull python
然后啟動一個后臺永不退出的容器:
sudo docker run --name mypython -dt python /bin/bash
然后就可以隨意使用 Python 了:
sudo docker exec -it mypython python [宿主機(jī)器的 Python 腳本,非容器內(nèi)部]
如果要安裝依賴:
sudo docker exec -it mypython pip install requests
這樣使用 Python 容器,不修改系統(tǒng)的一個文件,安全環(huán)保,不想用了,直接停止刪除容器,再刪除鏡像。