Docker 映象內部寸土寸金,如何能儘量減小映象的大小,其中一個方法是多階段構建
一些語言專案例如前端、Go 等,其構建階段需要一堆依賴如 node_modules
、vendor
等,但執行階段只需要 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 協議》,轉載必須註明作者和本文連結