[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

[Grafana] provisioning配置

在過往, Grafana 想要自動化的配置Dashboard 與 Alert等設定,都必須以API達成,實在很不方便。 這不管在設定資訊的版本控管,以及容器環境的使用,都很不方便。

好在 v5.0開始 ,提供配置yaml格式的設定檔,讓Grafana於初始化時,能預先載入設定,目前支持的設定有:

  • 數據源 Datasources
  • 儀錶板 Dashboards
  • 警報通知頻道 Alert Notification Channels

上述三種設定檔都需要放置於provisioning資料夾中才有作用。

1. 確認grafana.ini中的provisioning路徑

指定,譬如/etc/grafana/provisioning

2. 設定檔放置於對應資料夾中

  • Datasources:/provisioning/datasources/
  • Dashboards :/provisioning/dashboards/
  • Alert Notification Channels:/provisioning/notifiers/

2.1 配置datasources

這邊以Prometheus為例,datasources可以是複數個。

2.2 配置dashboards

以istio儀表板為例,providers可以是複數個。

每個provider都會指定一個放置json格式dashboard設定檔的路徑。

2.3 配置notifiers

以slack為例,notifiers可以是複數個。

5.x版的notifiers配置似乎有問題,沒有成功過。一直到Grafana 6才能正常使用。

參考資料:

[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 設計專業網站
立即開始使用