[英]Docker - Cannot remove dead container
我無法刪除死容器,在我重新啟動 Docker 服務后它再次出現。
docker ps -a
CONTAINER ID STATUS
11667ef16239 Dead
然后
docker rm -f 11667ef16239
然后,當我運行 docker ps -a 時,沒有顯示 docker 容器。
docker ps -a
CONTAINER ID STATUS
但是,當我重新啟動 docker 服務時:
service docker restart
並再次運行 docker ps -a :
docker ps -a
CONTAINER ID STATUS
11667ef16239 Dead
您還可以使用此命令刪除dead
容器
docker rm $(docker ps --all -q -f status=dead)
但是,我真的不確定為什么以及如何創建dead
容器。 每當我得到dead
容器時,這個錯誤似乎與https://github.com/typesafehub/mesos-spark-integration-tests/issues/34相關
[更新]隨着 Docker 1.13 更新,我們可以輕松刪除不需要的容器,懸空的圖像
$ docker system df #will show used space, similar to the unix tool df
$ docker system prune # will remove all unused data.
很可能,當守護進程試圖清理容器時發生了錯誤,他現在陷入了這種“僵屍”狀態。
恐怕您在這里唯一的選擇是手動清理它:
$ sudo rm -rf /var/lib/docker/<storage_driver>/11667ef16239.../
其中<storage_driver>
是您的驅動程序的名稱( aufs
、 overlay
、 btrfs
或devicemapper
)。
實際上,這些天為了擺脫那些死容器,情況略有變化,您可以嘗試卸載那些阻塞的文件系統以釋放它們
所以如果你收到這樣的消息
Error response from daemon: Cannot destroy container elated_wozniak: Driver devicemapper failed to remove root filesystem 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3: Device is Busy
運行這個
umount /var/lib/docker/devicemapper/mnt/656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3
之后您通常可以刪除容器
刪除死容器時出現以下錯誤(CentOS 7 上的 docker 17.06.1-ce):
Error response from daemon: driver "overlay" failed to remove root filesystem for <some-id>:
remove /var/lib/docker/overlay/<some-id>/merged: device or resource busy
這是我修復它的方法:
1.查看還有哪些進程也在使用docker資源
$ grep docker /proc/*/mountinfo
輸出類似這樣的內容,其中/proc/
之后的數字是pid
:
/proc/10001/mountinfo:179...
/proc/10002/mountinfo:149...
/proc/12345/mountinfo:159 149 0:36 / /var/lib/docker/overlay/...
2.查看上述pid的進程名
$ ps -p 10001 -o comm=
dockerd
$ ps -p 10002 -o comm=
docker-containe
$ ps -p 12345 -o comm=
nginx <<<-- This is suspicious!!!
因此,pid 為 12345 的nginx
似乎也在使用/var/lib/docker/overlay/...
,這就是為什么我們無法刪除相關容器並獲得device or resource busy
錯誤的原因。 (有關nginx
如何與 docker 容器共享相同的掛載命名空間從而防止其被刪除的討論,請參見此處。)
3.停止nginx
,然后我就可以成功刪除容器了。
$ sudo service nginx stop
$ docker rm <container-id>
我遇到了同樣的問題,兩個答案都沒有幫助。
對我有幫助的只是創建缺少的目錄並將它們刪除:
mkdir /var/lib/docker/devicemapper/mnt/656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3
mkdir /var/lib/docker/devicemapper/mnt/656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3-init
docker rm 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3
強行移除容器對我有用。
docker rm -f <id_of_the_dead_container>
備注:
請注意,此命令可能會引發此錯誤Error response from daemon: Driver devicemapper failed to remove root filesystem <id_of_the_dead_container>: Device is Busy
盡管有此消息,您的死容器設備映射器的安裝仍應刪除。 也就是說,您將不再訪問此路徑:
/var/lib/docker/devicemapper/mnt/<id_of_the_dead_container>
嘗試了以上所有方法(缺少重新啟動/重新啟動 docker)。
所以這里是錯誤 om docker rm:
$ docker rm 08d51aad0e74
Error response from daemon: driver "devicemapper" failed to remove root filesystem for 08d51aad0e74060f54bba36268386fe991eff74570e7ee29b7c4d74047d809aa: remove /var/lib/docker/devicemapper/mnt/670cdbd30a3627ae4801044d32a423284b540c5057002dd010186c69b6cc7eea: device or resource busy
然后我做了以下事情:
$ grep docker /proc/*/mountinfo | grep 958722d105f8586978361409c9d70aff17c0af3a1970cb3c2fb7908fe5a310ac
/proc/20416/mountinfo:629 574 253:15 / /var/lib/docker/devicemapper/mnt/958722d105f8586978361409c9d70aff17c0af3a1970cb3c2fb7908fe5a310ac rw,relatime shared:288 - xfs /dev/mapper/docker-253:5-786536-958722d105f8586978361409c9d70aff17c0af3a1970cb3c2fb7908fe5a310ac rw,nouuid,attr2,inode64,logbsize=64k,sunit=128,swidth=128,noquota
這就是保持它忙碌的有問題進程的 PID - 20416(/proc/ 之后的項目
所以我做了一個 ps -p 並讓我驚訝地發現:
[devops@dp01app5030 SeGrid]$ ps -p 20416
PID TTY TIME CMD
20416 ? 00:00:19 ntpd
一個真正的WTF時刻。 所以我用谷歌解決了問題並發現了這個:然后找到了這個https://github.com/docker/for-linux/issues/124
原來我不得不重新啟動 ntp 守護進程,這解決了這個問題!!!
嘗試運行以下命令。 它總是對我有用。
# docker volume rm $(docker volume ls -qf dangling=true)
# docker rm $(docker ps -q -f 'status=exited')
執行上述命令后,通過重啟docker,
# service docker restart
grep 656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3 /proc/*/mountinfo
然后找到656cfd09aee399c8ae8c8d3e735fe48d70be6672773616e15579c8de18e2a3b3and
的 pid 並殺死它
我已經嘗試了上面的建議,但沒有奏效。
然后
docker system prune -a
,第一次沒有用docker system prune -a
。 這次它起作用了。 它將發送一條警告消息,最后詢問“您確定要繼續嗎?y/n?. Ans:y . 它會計時一段時間,最后死容器消失了。docker ps -a
進行驗證重要- 這是核選項,因為它會破壞所有容器 + 圖像
對於刪除所有死容器docker rm -f $(docker ps --all -q -f status=dead)
刪除所有退出的容器docker rm -f $(docker ps --all -q -f status=exited)
正如我所擁有的-f
是必要的
對於 Windows:
del D:\ProgramData\docker\containers\{CONTAINER ID}
del D:\ProgramData\docker\windowsfilter\{CONTAINER ID}
然后重啟Docker 桌面
嘗試殺死它,然后刪除 >:) 即docker kill $(docker ps -q)
試試,它對我有用:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4f13b53be9dd 5b0bbf1173ea "/opt/app/netjet..." 5 months ago Dead appname_chess
$ docker rm $(docker ps --all -q -f status=dead)
Error response from daemon: driver "devicemapper" failed to remove root filesystem for 4f13b53be9ddef3e9ba281546aef1c544805282971f324291a1dc91b50eeb440: failed to remove device 487b4b73c58d19ef79201cf6d5fcd6b7316e612e99c14505a6bf24399cad9795-init: devicemapper: Error running DeleteDevice dm_task_run failed
su
cd /var/lib/docker/containers
[root@localhost containers]# ls -l
total 0
drwx------. 1 root root 312 Nov 17 08:58 4f13b53be9ddef3e9ba281546aef1c544805282971f324291a1dc91b50eeb440
[root@localhost containers]# rm -rf 4f13b53be9ddef3e9ba281546aef1c544805282971f324291a1dc91b50eeb440
systemctl restart docker
試試這個對我有用:
docker rm -f <container_name>
eg. docker rm -f 11667ef16239
這里有很多答案,但沒有一個涉及對我有用的(快速)解決方案。
我正在使用 Docker 版本 1.12.3,構建 6b644ec。
我只是運行docker rmi <image-name>
來獲取死容器來自的圖像。 然后docker ps -a
顯示死容器完全丟失。
然后,當然,我只是重新拉取圖像並再次運行容器。
我不知道它是如何發現自己處於這種狀態的,但它是……
在我的情況下,我不得不刪除它
rm -r /var/lib/docker/containers/<container-id>/
它奏效了。 也許這就是你在 docker 版本 ~19 中解決它的方式。 我的 docker 版本是19.03.12
,
在 Centos7 和 Docker 1.8.2 上運行,我無法使用 Zgr3doo 的解決方案通過 devicemapper 卸載(我認為我得到的響應是未安裝/找到卷。)
我認為 sk8terboi87 ツ 的回答也發生了類似的事情:我相信消息是無法卸載卷,並且它列出了它試圖卸載以刪除死容器的特定卷。
對我有用的是先停止 docker,然后手動刪除目錄。 我能夠通過先前命令的錯誤輸出來確定它們是哪些,以刪除所有死容器。
為上述模糊的描述道歉。 我在處理死容器幾天后發現了這個 SO 問題。 .. 但是,我今天注意到了類似的模式:
$ sudo docker stop fervent_fermi; sudo docker rm fervent_fermi fervent_fermi
Error response from daemon: Cannot destroy container fervent_fermi: Driver devicemapper failed to remove root filesystem a11bae452da3dd776354aae311da5be5ff70ac9ebf33d33b66a24c62c3ec7f35: Device is Busy
Error: failed to remove containers: [fervent_fermi]
$ sudo systemctl docker stop
$ sudo rm -rf /var/lib/docker/devicemapper/mnt/a11bae452da3dd776354aae311da5be5ff70ac9ebf33d33b66a24c62c3ec7f35
$
我確實注意到,當使用這種方法時,docker 重新創建了具有不同名稱的圖像:
a11bae452da3 trend_av_docker "bash" 2 weeks ago Dead compassionate_ardinghelli
這可能是因為容器發出了 restart=always,但是,容器 ID 與之前使用我強制刪除的卷的容器的 ID 匹配。 刪除這個新容器沒有任何困難:
$ sudo docker rm -v compassionate_ardinghelli
compassionate_ardinghelli
擺脫死容器進程的最佳方法是重新啟動 docker 服務。 我無法刪除容器,因為它卡在重新啟動狀態,我剛剛重新啟動了 docker 服務,它對我有用。
我在 Windows 右下角重新啟動了 Docker 代理,docker iCon,重新啟動 Docker。 然后我運行 docker ps -a 並看到容器仍然坐在那里。 然后我運行 docker rm -f container id 這對我有用。
如果您是 Mac/Windows 用戶並且擁有 Docker Desktop,您只需重新啟動您的 Docker Desktop,然后在 UI 中您就可以簡單地刪除容器,而不會產生任何麻煩。
對於未來的用戶,我想分享我的經驗: (2022)
查看我運行的所有容器
docker container ls -a
然后殺死我跑的容器:
docker rm -f YOUR_CONTAINER_ID
例如:
docker rm -f d389s8dffe
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.