進行多階段構建時,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






