簡體   English   中英

Docker - 無法刪除死容器

[英]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>是您的驅動程序的名稱( aufsoverlaybtrfsdevicemapper )。

實際上,這些天為了擺脫那些死容器,情況略有變化,您可以嘗試卸載那些阻塞的文件系統以釋放它們

所以如果你收到這樣的消息

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 並殺死它

我已經嘗試了上面的建議,但沒有奏效。

然后

  1. 我嘗試: docker system prune -a ,第一次沒有用
  2. 我重新啟動系統
  3. 我再試一次docker system prune -a 這次它起作用了。 它將發送一條警告消息,最后詢問“您確定要繼續嗎?y/n?. Ans:y . 它會計時一段時間,最后死容器消失了。
  4. 使用docker ps -a進行驗證

重要- 這是核選項,因為它會破壞所有容器 + 圖像

  1. 對於刪除所有死容器docker rm -f $(docker ps --all -q -f status=dead)

  2. 刪除所有退出的容器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

試試這個,它在 centos 上對我有用 1) docker container ls -a 給你一個你想擺脫的容器檢查狀態列表在此處輸入圖像描述 2) docker container rm -f 97af2da41b2b 不是一個很大的粉絲力量標志,但會檢查它是否有效,只是再次觸發命令或列出它。 在此處輸入圖像描述 3)繼續直到我們清除所有死容器在此處輸入圖像描述

擺脫死容器進程的最佳方法是重新啟動 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM