[Day 9] Oops!Docker - Image 瘦身大法
· 1 min read
今天為大家來簡單介紹Docker在17.05版本後,才支援的新功能。
Docker - Multiple Stage Builds
簡易說明:此功能可以同時操作多個Dockerfiles的行為,使得在build image上方便了許多
需求版本: Docker 17.05+
常用應用場景
1.編譯原始碼為可執行檔後再把執行檔放入乾淨的環境
# build stage
FROM golang:1.14.7-alpine3.12 AS builder
LABEL stage=ithome-intermediate
ENV GO111MODULE=on
ADD ./ /go/src/ithome
RUN cd /go/src/ithome && go build -mod vendor
# final stage
FROM alpine:3.11.3
COPY --from=builder /go/src/ithome/ithome /go/src/ithome/.env ./
CMD ["./ithome"]
- 從 A image 複製檔案 到 B image
# 將要被複製的image as builder
FROM nginx:latest AS builder
# 進行複製動作
FROM nginx:latest
COPY --from=builder /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/my-copy-default.conf
RUN ls /etc/nginx/conf.d/
通常目的都是為了讓build的image乾淨又輕量化,而輕量化的優點:
- image的安全性會提升許多,因為沒有裝一些哩哩扣扣的套件
docker push/pull image
的過程會更加快速,因為image size縮小許多!
相關來源: https://docs.docker.com/develop/develop-images/multistage-build/
Oops!抓不到時區
相信大家在輕量化image後,image瘦了不少 但是當你的image內需要時區設定時,在alpine image預設是沒有提供此設定的唷 所以要在dockerfile內加上TimeZone tzdata!
RUN apk add --no-cache tzdata
這樣才有辦法抓到時區設定檔
以上述範例1,來調整的話,就下方這樣子
# build stage
FROM golang:1.14.7-alpine3.12 AS builder
LABEL stage=ithome-intermediate
ENV GO111MODULE=on
ADD ./ /go/src/ithome
RUN cd /go/src/ithome && go build -mod vendor
# final stage
FROM alpine:3.11.3
# add TimeZone tzdata
RUN apk add --no-cache tzdata
COPY --from=builder /go/src/ithome/ithome /go/src/ithome/.env ./
CMD ["./ithome"]
以上範例,大家可以練習一下~多使用就會知道這個功能的美好!