Docker 分階段構建映象

m01i0ng發表於2019-01-25

Docker 映象內部寸土寸金,如何能儘量減小映象的大小,其中一個方法是多階段構建
一些語言專案例如前端、Go 等,其構建階段需要一堆依賴如 node_modulesvendor 等,但執行階段只需要 build 出來的靜態頁面或二進位制檔案,所以要將構建和執行分開為兩個階段,最終映象中只包含 build 的結果

以前端專案舉例,目錄結構如下:

├── .docker
├── .dockerignore
├── Dockerfile
├── README.md
├── node_modules
├── package.json
├── public
├── src
└── yarn.lock

.docker 資料夾中存放了 nginx 的配置
.dockerignore 檔案寫不希望新增到映象中的檔案,比如 node_modules
Dockerfile 是主角,內容如下:

# 第一階段,拉取 node 基礎映象並安裝依賴,執行構建
FROM node:11-alpine as builder

WORKDIR /tmp
COPY . .
RUN npm config set registry https://registry.npm.taobao.org \
    && npm i -g yarn
RUN yarn && yarn build

# 第二階段,將構建完的產物 build 資料夾 COPY 到實際 release 的映象中,會丟棄第一階段中其他的檔案
FROM nginx:alpine

COPY .docker/conf/default.conf /etc/nginx/conf.d/
COPY --from=builder /tmp/build /usr/share/nginx/html

EXPOSE 80

執行 docker build -t tinyalley/demo . 就會生成映象

跟最終 release 映象無關的檔案依賴等等都要放在構建階段

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章