Docker: no space left on device

前言 最近在 build docker image 的時候遇到 No space left on device 的問題。 因為在解的過程發現好像蠻多人都有遇過這個問題,於是就把解的過程記錄下來,希望能幫到其他人。 問題描述 今天在 build docker image 的時候出現以下錯誤: ERROR: Could not install packages due to an EnvironmentError: [Errno 28] No space left on device 因為錯誤出現在 pip install 的步驟,所以我先往 pip 的方向去找,找到以下的解決辦法: 在家目錄底下開一個新的 tmp 資料夾,讓系統使用該資料夾來解決 tmp 空間不足的問題。 使用以下命令: pip install --no-cache-dir <package_name> 選擇了第二個方法,但問題依然存在。後來發現這其實是 Docker 的暫存空間被塞滿導致的問題。 解決方案 使用 docker system prune 指令來清理 Docker 暫存空間: docker system prune 這將會刪除: 所有停止的容器 沒有被至少一個容器使用的網路 所有的 dangling images 和 build cache 若還是無法解決,則進一步檢查容器的 log 檔: du -d1 -h /var/lib/docker/containers | sort -h 找到占用空間大的 log 檔後,使用以下指令清除 log: ...

June 9, 2020 · 1 min · Set Mao

Django 1.11 to 2.2

前言 因為 Django 1.11 在今年四月開始停止更新了,所以花了一天時間幫公司從 Django 1.11 升級到 2.2 於是想用這篇來記錄一下升級的過程 前置作業: 我在升級前找了很多資料跟別人升級的心得,主要參考以下幾篇 博客将 Django 1.11+ 升级到 Django 2.2+ 遇到的问题及规避方法 Django1和2的区别 Upgrading Django to a newer version 第一篇主要是別人實際更新上遇到個問題 第二篇是再講 Django 1.11 跟 Django 2.X 主要差別在哪 第三篇是官方文件 開始! python -Wa manage.py test 先用以下指令掃一下升級後現在的 code 可能會在哪裡報錯 python -Wa manage.py test TypeError: init() missing 1 required positional argument: ‘on_delete’ 用步驟一的指令掃完後,報了很多下面的錯誤 TypeError: init() missing 1 required positional argument: ‘on_delete’ 出現這個的原因是因為 Django 2.X 開始 ForeignKey 的 on_delete 參數變成必填欄位(1.11 預設值為 on_delete=models.CASCADE),所以我們得先手動將 on_delete=models.CASCADE 加上去 ...

June 8, 2020 · 3 min · Set Mao

Django Migrations

前言 Django 的 Migrations 除了在能在資料庫中建立新的資料表、修改舊的資料表結構外,我們也能自己寫 code 在新增資料表、修改舊的資料表結構的同時對資料表做 CRUD(Create, Read, Update, Delete) 比如以下情境: 我現在要新建一個資料表用來存 Email Template 給客戶使用,希望在建立資料表的同時能將一些 default template 一起寫入資料庫中 原本有兩個資料表分別負責存不同的資料,現在因為一些關係要把這兩個資料表整合在一起,所以我想在新建資料表後將舊的資料表中的資料轉移到新的資料表後將舊的兩個資料表刪除 這些都可以在 Django Migrations 中完成! 首先我們先執行下面的指令來生出一個空的 migration python manage.py makemigrations --empty yourappname 接著在 migration 中加入以下的 code,並將 combine_names 改成你想做的事情 from django.db import migrations def combine_names(apps, schema_editor): # We can't import the Person model directly as it may be a newer # version than this migration expects. We use the historical version. Person = apps.get_model('yourappname', 'Person') for person in Person.objects.all(): person.name = '%s %s' % (person.first\_name, person.last\_name) person.save() class Migration(migrations.Migration): dependencies = [ ('yourappname', '0001\_initial'), ] operations = [ migrations.RunPython(combine_names), ] 這邊需要注意的是 model 需要用這種方式取得: ...

May 28, 2020 · 1 min · Set Mao