2015-06-02 59 views
115

空間我以下面的方式安裝一個Debian 7機器上搬運工多克爾錯誤:設備上沒有剩餘

回聲DEB http://get.docker.io/ubuntu搬運工主>

/etc/apt/sources.list.d/docker。列表

sudo apt-get update curl -sSL https://get.docker.com/ubuntu/ |須藤SH

後,當我第一次嘗試創建一個圖片它失敗,出現以下錯誤

time="2015-06-02T14:26:37-04:00" level=info msg="[8] System error: write /sys/fs/cgroup/docker/01f5670fbee1f6687f58f3a943b1e1bdaec2630197fa4da1b19cc3db7e3d3883/cgroup.procs: no space left on device" 

這裏是泊塢窗信息

Containers: 2 
Images: 21 
Storage Driver: aufs 
Root Dir: /var/lib/docker/aufs 
Backing Filesystem: extfs 
Dirs: 25 
Dirperm1 Supported: true 
Execution Driver: native-0.2 
Kernel Version: 3.16.0-0.bpo.4-amd64 
Operating System: Debian GNU/Linux 7 (wheezy) 
CPUs: 2 
Total Memory: 15.7 GiB 


WARNING: No memory limit support 
WARNING: No swap limit support 

我怎樣才能提高記憶力?系統配置存儲在哪裏?

從Kal的建議:

當我擺脫了所有的圖像和它做免費容器用相同的錯誤而失敗之前的一些空間和形象構建跑更長的時間。所以問題是,這是指哪個空間,以及如何配置它?

+0

有時,您可以點擊[每個容器大小限制](https://unix.stackexchange.com/q/203168/8503),具體取決於您的存儲後端。該鏈接顯示瞭如何爲devicemapper修復它。 – jpaugh

+0

當我的磁盤超出inodes時,出現此錯誤。檢查'df -ih' –

回答

54

檢查/ var上的可用空間,因爲這是默認情況下(在/ var/lib/docker中)Docker存儲圖像文件的位置。

首先使用docker ps -a清理所有容器(包括停止的容器)和docker rm以清除它們;然後使用docker images列出您存儲的所有圖像,並使用docker rmi刪除它們。

接下來通過docker守護進程上的-g選項更改存儲位置,或編輯/etc/default/docker並將-g選項添加到DOCKER_OPTS-g指定「Docker運行時」的位置,它基本上是Docker在創建映像和運行容器時創建的所有內容。選擇具有足夠空間的位置,因爲所使用的磁盤空間會隨着時間而增長。如果編輯/etc/default/docker,則需要重新啓動docker守護程序才能使更改生效。

現在您應該可以創建一個新鏡像(或從Docker Hub中拖出一個鏡像),並且您應該看到使用-g選項指定的目錄中創建了一堆文件。

+0

感謝Kal,我無法找到有關DOCKER_OPTS的文檔。 -g選項意味着什麼?應該設置什麼?也可以刪除docker/aufs/mnt下的東西? –

+0

嘿紅寶石,我不認爲我曾經發現過一個關於DOCKER_OPTS的真實文檔,但是在討論編輯它的文檔中有些地方。我能找到的最接近https://docs.docker.com/installation/ubuntulinux/#optional-configurations-for-docker-on-ubuntu的結尾,它討論瞭如何編輯DOCKER_OPTS中的DNS設置。 DOCKER_OPTS中的選項只傳遞給守護進程,因此對其的引用是https://docs.docker.com/reference/commandline/cli/#daemon。 -g設置「Docker運行時」的基址位置 – Kal

+0

也可以刪除docker/aufs/mnt下的內容嗎? –

4

您的cgroups啓用了cpuset控制器。該控制器在NUMA環境中非常有用,它允許精確指定哪些CPU /內存組允許您的任務運行。

默認情況下,強制cpuset.memscpuset.cpus沒有設置,這意味着您的任務沒有「剩餘空間」,因此錯誤。

解決此問題的最簡單方法是在root cgroup中啓用cgroup.clone_children爲1。在你的情況下,它應該是

echo 1 > /sys/fs/cgroup/docker/cgroup.clone_children 

它基本上會指示系統自動初始化容器的cpuset.mems,並從他們的父母的cgroup cpuset.cpus

+0

這是正確的答案。 真的只需簡單地將Docker升級到任何東西> = Docker 1.8 *應該*解決它 這與https://github.com/opencontainers/runc/issues/133 有關。從這個問題,另一個潛在的解決方法是「 'echo 0>/sys/fs/cgroup/cpuset/system.slice/cpuset.mems' – cpuguy83

26

如果它只是一個測試安裝泊塢窗(即不生產),並且你不關心做一個核乾淨,您可以:

乾淨所有的容器: docker ps -a | sed '1 d' | awk '{print $1}' | xargs -L1 docker rm

乾淨所有圖片: docker images -a | sed '1 d' | awk '{print $3}' | xargs -L1 docker rmi -f

同樣,我在開發Docker時在我的ec2實例中使用這個,而不是在任何嚴重的QA或生產路徑中。最重要的是,如果你有你的Dockerfile,很容易重建或者docker pull

+1

在我的boot2docker實例中,我必須調用'docker images -a | sed'1 d'| awk'{print $ 3}'| xargs docker rmi -f'。 xargs'的OS X BSD版本支持'-L'選項,與boot2docker的版本不同。 – orluke

+1

您可以使用'docker ps -a -q'等來避免文本操作,即'docker rm $(docker ps -a -q); docker rmi -f $(docker images -a -q)'應該訣竅 –

53

UPDATE
隨着Docker變得越來越發達,下面的命令已經變成黑客。目前最好的做法是

docker system prune 

這將刪除:

- all stopped containers 
- all volumes not used by at least one container 
- all networks not used by at least one container 
- all dangling images 

如下,這是核。


清理您的系統,先去除容器

$ docker rm $(docker ps -aq) 

然後刪除圖片

$ docker rmi $(docker images -q) 

這當然是核,並會刪除所有容器和所有圖像。您可以通過docker rm #CONTAINER_ID#docker rmi #IMAGE_ID一次刪除它們。

151

我有同樣的錯誤,並以這種方式解決:

1。刪除Docker中的孤立卷,可以使用內置的docker volume命令。內置命令還會刪除/ var/lib/docker/volumes中不是卷的任何目錄,因此請確保您沒有在其中保存任何內容。

警告非常小心這一點,如果你有你想保留

清理了一些數據:

$ docker volume rm $(docker volume ls -qf dangling=true) 

附加命令:

名單懸空卷:

$ docker volume ls -qf dangling=true 

列出所有卷:

$ docker volume ls 

2。另請考慮刪除所有未使用的圖像。

首先擺脫<none>圖像(這些圖像有時會在生成圖像時生成,如果由於某種原因造成圖像中斷,則會停留在那裏)。

這裏是一個不錯的劇本我用它來刪除它們

docker rmi $(docker images | grep '^<none>' | awk '{print $3}') 

然後,如果你正在使用泊塢窗撰寫本地建立圖像的每一個項目。你最終會得到很多通常以你的文件夾命名的圖像(例如,如果你的項目文件夾名爲Hello,你會發現圖像名稱爲Hello_blablabla)。所以也可以考慮刪除這些圖片

您可以編輯上面的腳本將其刪除或通過使用

docker rmi {image-name}

+14

只需要注意:Mac上的awk命令必須用單引號包圍,而不是雙引號,否則它會被忽略。 – ndtreviv

+1

我在MAC上,它爲我工作!但感謝您的建議。 –

+2

多奇怪!它不適合我。只需輸出與grep相同的結果。呃,好吧。奇怪的事情發生了。 – ndtreviv

0

乾淨搬運工手動刪除它們,

docker images --no-trunc | grep '<none>' | awk '{ print $3 }' \ 
| xargs docker rm 
0

1)清潔蹺着images
docker rmi $(docker images -f「dangling = true」-q)
2)刪除不需要的卷
2)刪除未使用的圖像
2)刪除未使用的容器

5

刪除所有未使用的容器,容量,網絡和圖像一次(https://docs.docker.com/engine/reference/commandline/system_prune/#related-commands):

docker system prune -a -f 

如果這還不夠,一個可以刪除運行集裝箱第一:

docker rm -f $(docker ps -a -q) 
docker system prune -a -f 

增加的/ var/lib中/泊塢窗或使用其他位置有更多空間也是一個不錯的選擇,以擺脫這種錯誤的(見How to change the docker image installation directory?

+0

'docker system prune'不會移除卷。 – Bonifacio2

+0

'docker system prune -a -f --volumes'將刪除卷。 –

4

你也可以使用:

docker system prune 

或只是卷:

docker volume prune 
+0

'碼頭:'系統'不是碼頭命令.' –

0

如果您是通過泊塢窗工具包使用boot2docker圖像,則問題來源於這樣的事實是,boot2docker虛擬機已經空間不足。

當您執行docker import或添加新圖像時,圖像被複制到/mnt/sda1中,該圖像可能已滿。

一種方法來檢查你的鏡像中什麼樣的空間,是ssh到虛擬機並運行df -h和在/ mnt/sda1的檢查剩餘空間

ssh命令是 docker-machine ssh default

一旦你確定這確實是一個空間問題,你可以按照這個問題的一些答案中的說明進行清理,或者你可以選擇調整boot2docker映像本身的大小,方法是增加/mnt/sda1的空間

你可以請按照此處的說明進行圖像大小調整 https://gist.github.com/joost/a7cfa7b741d9d39c1307

相關問題