[Docker] 使用多階段構建(multi-stage builds)時的垃圾清理

進行多階段構建時,builder image通常很佔空間,
尤其當系統架構是微服務,又做了自動化建構時,可能三兩天Runner硬碟就會滿載,
透過image filter的設定,可以用來刪除編譯時產生的builder image,
例如:

FROM builder-image:latest as builder
LABEL stage=builder
LABEL build=my-service
COPY . .
RUN go build -o app *.go
FROM alpine:latest
COPY --from=builder app .
CMD ["./app"]

build完之後,清理builder images

docker image prune -f --filter label=stage=builder --filter label=build=my-service

套用在Gitlab CI的話,可以利用CI_JOB_ID來實現,
先讓CI_JOB_ID,在編譯時帶入builder image:

FROM builder-image:latest as builder
ARG job_id
LABEL stage=builder
LABEL build=$job_id
COPY . .
RUN go build -o app *.go
FROM alpine:latest
COPY --from=builder app .
CMD ["./app"]
docker build --pull \
 --build-arg job_id=${CI_JOB_ID} \
 -t my-service:latest .

並在build job設定中新增after script:

.remove-intermediate-containers:
  after_script:
    - docker image prune -f --filter label=stage=builder --filter label=build=$CI_JOB_ID

參考資料:

https://docs.docker.com/engine/reference/commandline/images/#filtering

https://docs.gitlab.com/ee/ci/variables/#predefined-environment-variables

[Gitlab]Runner磁碟空間不足問題

專案若更新頻繁,
Runner所在VM(或主機)可能會三不五時遇到個問題,
磁碟空間不足,
此時可以用以下指令確診病情:
docker system df
若顯示有很大量可回收資源(由reclaimable欄位查看),
此時就可以考慮定時清理docker不用的資源,
一個簡單好用的方案是crontab搭配docker system prune。

選定執行時間建立crontab

依照想要的頻率建立crontab,
我希望每天清理,
因此直接建立在/etc/cron.daily/資料夾中。
cd /etc/cron.daily
vim clean-docker-system.sh

撰寫corntab腳本

使用docker system prune指令清理不使用的資源,
這邊因VM只供runner使用,做了徹底清理。

#!/bin/sh
docker system prune --volumes --all --force

說明有用到的幾個選項:

  • –all , -a:清理所有unused鏡像,而不單單是dangling狀態的鏡像
  • –volumes :清理不使用的資料卷
  • –force , -f :不做確認詢問

若是環境有其他服務使用docker,
須謹慎使用–volumes選項,避免誤刪資料。

設定corntab腳本權限

新建的檔案權限是664,
若要將該檔案變成可執行檔,且不讓其他人修改檔案,
要將檔案權限調整為755

chmod 755 clean-docker-system.sh

到此就設定完成囉,
可以隔段時間再檢查是否有正常運作。

[GitLab]使用Docker佈署Runner

Step 1:確認GitLab 設定

URL與Token待會會使用到。

Step 2: 取得最新版本Runner image

 docker pull gitlab/gitlab-runner:latest null

Step 3:建立Runner

docker run -d --name gitlab-runner-1  \
--restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest

Step 4:配置&註冊Runner

docker exec -it gitlab-runner-1 gitlab-runner register -n \
--url https://gitlab.com/ \
--registration-token abcdefg1234567 \
--description "Test Runner 1" \
--tag-list "docker-build, docker-deploy” \
--machine-max-builds 4 \
--executor docker \
--docker-image "docker:stable" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock

參考資料

使用 WordPress.com 設計專業網站
立即開始使用