現象:
用了幾天vagrant後,發現docker 裡的 Mysql5.7 服務無法啟動,用docker ps 命令,發現mysql一直在反覆重啟, 檢視mysql log 發現說磁碟空間不夠, 導致mysql無法啟動。
覺得很奇怪, docker裡只安裝了redis和mysql兩個image, 也沒用幾天mysql, 怎麼會40G的空間都滿了?
於是一通百度查詢, 都說是mysql日誌過多,但是一個一個目錄的用df -sh * 和 df -h 檢視, 發現日誌log並不大。 進一步查詢發現是/var/lib/docker/overlay2下面的子目錄裡有檔案過大,於是
開始陷入了坑裡, 一直懷疑是docker的問題, 但是網上的辦法都說是log檔案佔用空間,使用 cat /dev/null > *-json.log 刪除, 結果發現毫無卵用。
實在無法解決,忍痛將docker的images全部刪掉看看, 結果發現還是沒用。。。
轉機:
經過幾個小時的死磕,終於發現了一個資料夾: /vagrant/AppData, 這個資料夾居然有32G? 再一細看不得了, 這個/vagrant下除了AppData資料夾,怎麼還有一堆檔案感覺跟我的PC電腦
裡的 user資料夾裡的東西一模一樣? 比如有 download , 有document, 有music , 還有OneDrive, 虛擬機器上怎麼可能有微軟的OneDrive? 於是突然靈光一現,難道vagrant把我電腦裡的
檔案都複製到虛擬機器裡了? 順著這個思路百度,果然柳暗花明又一村,徹底找到了問題所在,那就是:
vagrant提供了將本機目錄掛載到虛擬機器目錄下的功能,預設是將vagrant配置檔案所在目錄掛載到虛擬機器/vagrant目錄下。
即: c:\user\nioth(這裡是我電腦的使用者名稱,你可以改成你的)\Vagrantfile 所在的目錄 與 虛擬機器 /vagrant目錄進行同步,
因此, 會將本機大量檔案複製到虛擬機器, 導致虛擬機器空間爆滿。 並不是docker的問題啊, 可憐我把docker裡的image都刪掉了,回頭又得重灌mysql,配置一堆資料庫,鬱悶啊~~~
解決辦法:
一開始找到的是 C:\Users\nioth\Vagrantfile 檔案裡有一行配置(預設是註釋掉的):
#config.vm.synced_folder ".", "/vagrant_data"
於是修改這個檔案,改成下面(MyVagrantSyncFolder是自己新建得資料夾,空的,放在C:\Users\nioth\下面):
(這裡有一個失敗的伏筆:為什麼我看到虛擬機器裡的資料夾是叫vagrant,並不是叫vagrant_data啊。不管了,試試再說。)
config.vm.synced_folder "./MyVagrantSyncFolder", "/vagrant_data"
再用vagrant reload 重啟, 果然發現沒有用,心裡一緊,不會吧, 再用Everything軟體搜一遍,發現另外還有一個地方有一個vagrant配置檔案:
C:\Users\nioth\.vagrant.d\boxes\centos-VAGRANTSLASH-7\2004.01\virtualbox\Vagrantfile
原來如此: 每一個虛擬機器的作業系統裡還有自己的配置檔案!!!啊啊啊!
開啟發現有如下配置:
Vagrant.configure("2") do |config|config.vm.base_mac = "5254004d77d3"config.vm.synced_folder ".", "/vagrant", type: "rsync"end
( 話說configure("2")是什麼鬼? 沒有1嗎? )
終於找到你了!
於是,修改為:
Vagrant.configure("2") do |config|config.vm.base_mac = "5254004d77d3"config.vm.synced_folder "./MyVagrantSyncFolder", "/vagrant", type: "rsync"end
(原來那個檔案裡的配置還給它註釋掉,恢復原樣。)
儲存檔案,再用vagrant reload, 大功告成!
控制檯顯示:
==> default: Configuring and enabling network interfaces...==> default: Rsyncing folder: /cygdrive/c/Users/nioth/MyVagrantSyncFolder/ => /vagrant==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`==> default: flag to force provisioning. Provisioners marked to run always will still run.
現在是 ./MyVagrantSyncFolder 資料夾與 虛擬機器中的/vagrant資料夾進行對映, 這樣就不會將大量主機檔案複製到虛擬機器了。