前面 使用 Docker 部署 Node 應用 一文中完成了映象的建立和執行,不過生成的映象還有些粗糙,需要進一步優化。 映象的優化通過 通過如下命令檢視映象檔案裡都有什麼檔案以及分別佔用的空間大小: $ docker history --human --format "{{.CreatedBy}}: {{.Size}}" wayou/my-app
CMD ["node" "dist/main"]: 0B
EXPOSE map[3000/tcp:{}]: 0B
COPY . . # buildkit: 2.24MB
RUN /bin/sh -c yarn build # buildkit: 118B
RUN /bin/sh -c yarn install --frozen-lockfil…: 484MB
RUN /bin/sh -c curl -o- -L https://yarnpkg.c…: 7.59MB
COPY package.json yarn.lock ./ # buildkit: 271kB
WORKDIR /usr/src/app: 0B
/bin/sh -c #(nop) CMD ["node"]: 0B
/bin/sh -c #(nop) ENTRYPOINT ["docker-entry…: 0B
/bin/sh -c #(nop) COPY file:238737301d473041…: 116B
/bin/sh -c set -ex && for key in 6A010…: 7.76MB
/bin/sh -c #(nop) ENV YARN_VERSION=1.22.5: 0B
/bin/sh -c ARCH= && dpkgArch="$(dpkg --print…: 100MB
/bin/sh -c #(nop) ENV NODE_VERSION=14.17.0: 0B
/bin/sh -c groupadd --gid 1000 node && use…: 333kB
/bin/sh -c set -ex; apt-get update; apt-ge…: 561MB
/bin/sh -c apt-get update && apt-get install…: 141MB
/bin/sh -c set -ex; if ! command -v gpg > /…: 7.82MB
/bin/sh -c set -eux; apt-get update; apt-g…: 24.1MB
/bin/sh -c #(nop) CMD ["bash"]: 0B
/bin/sh -c #(nop) ADD file:d9e4f6f4fc33703b7…: 101MB
使用更小的基礎映象通過 node 在 Docker 市場的介面可看到,其中包含很多可使用的選擇,
其中 jessie-, buster- and stretch-* 基於 Debian 系統,alpine-* 則是 Alpine Linux。一般使用 alpine 即可。 - FROM node:14
+ FROM node:14-alpine
再次檢視大小,減少了一半多來到 600+M $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wayou/my-app latest f8b6ba45c68f 21 seconds ago 603MB
<none> <none> fe1ff8163c15 23 hours ago 1.44GB
<none> <none> 6e0fb94473a1 3 days ago 1.44GB
多次編譯詳情及原理參見 Use multi-stage builds。簡單來說,構建映象檔案包含很多步驟,中間步驟依賴使用的東西其實在最後成品中並不需要。 因此,我們可以將整個構建過程分成多步,得到一些中間結果。而這些中間結果是下一步所需要的,但生成這些中間結果的依賴卻是下一步不需要的,就可以捨棄。 優化後的 Dockerfile:
再次生成映象後檢視大小,又減小了一半,來到 300+M,
優化 node 依賴去掉 - RUN yarn install --frozen-lockfile
+ RUN yarn install --frozen-lockfile --production=true
但是,如果編譯過程需要編譯 TypeScript,跑測試,跑 Lint 等,此方法就不適用,因為這些依賴均在 凡事無絕對,雖然安裝時不能去掉,但可以在用完之後去掉。 所以在 RUN yarn build
+ # remove development dependencies
+ RUN npm prune --production
再次檢視大小,減小了一半多:
node-prune使用 node-prune 進一步刪除依賴中的無用檔案,比如 markdown,測試檔案,TypeScript 的型別檔案等。 更新後的 Dockerfile:
注意,執行上面的 Dockerfile 後會報如下錯誤: => ERROR [build_image 2/9] RUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash 0.4s
------
> [build_image 2/9] RUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash:
#6 0.366 /bin/sh: curl: not found
#6 0.366 /bin/sh: bash: not found
那是因為切換到
這次優化後的大小減少了幾 M: $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wayou/my-app latest 113ca4503190 3 minutes ago 126MB
<none> <none> 9aba2a428703 46 minutes ago 129MB
<none> <none> c0ffda4c908a 57 minutes ago 351MB
<none> <none> f8b6ba45c68f About an hour ago 603MB
<none> <none> fe1ff8163c15 24 hours ago 1.44GB
手動刪除根據 Honey, I shrunk the node_modules! ...and improved app’s performance in the process 裡的介紹再手動刪除一些依賴檔案:
檢視大小,減小了 3M,聊勝於無: $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wayou/my-app latest 2c54b4ee27cd 4 seconds ago 123MB
<none> <none> 113ca4503190 9 minutes ago 126MB
<none> <none> 9aba2a428703 52 minutes ago 129MB
<none> <none> c0ffda4c908a About an hour ago 351MB
<none> <none> f8b6ba45c68f About an hour ago 603MB
<none> <none> fe1ff8163c15 24 hours ago 1.44GB
<none> <none> 6e0fb94473a1 3 days ago 1.44GB
相關資源 |
The text was updated successfully, but these errors were encountered: |
使用 Docker 部署 Node 應用 - 映象檔案尺寸的優化
相關文章
- 使用 Docker 部署 Node 應用Docker
- 教你使用Docker容器化Node.js應用程式DockerNode.js
- docker映象瘦身&優化Docker優化
- Docker如何高效部署Node應用?看這裡Docker
- 使用Docker容器化部署實踐之Django應用部署(一)DockerDjango
- Docker容器化部署Python應用DockerPython
- 如何使用 docker 部署前端應用Docker前端
- Docker搭建部署Node專案Docker
- 基於 Docker 映象部署 go 專案DockerGo
- Docker常用的應用部署Docker
- 聊聊.net應用程式的Docker映象Docker
- 最佳化您的部署:Docker 映象最佳實踐Docker
- 在生產環境使用Docker部署應用Docker
- ?從零開始Docker化你的Node.js應用DockerNode.js
- Docker_Docker應用部署4Docker
- Docker部署Angular應用DockerAngular
- Jenkins + Docker + Gitee自動化部署SpringBoot應用JenkinsDockerGiteeSpring Boot
- Nodejs Docker 映象體積優化實踐NodeJSDocker優化
- docker 怎麼下載指定版本的映象檔案Docker
- Docker配置檔案配置映象加速器Docker
- docker映象構建libreoffice轉換檔案Docker
- Docker將映象檔案釋出到阿里雲Docker阿里
- Docker將映象檔案釋出到私服庫Docker
- 如何獲得更小的應用檔案尺寸?來了解下 Android App BundleAndroidAPP
- JKube幫助Java應用Docker化部署到KubernetesJavaDocker
- Docker容器與虛擬化技術:OpenEuler 部署 docker容器應用Docker
- springboot docker jenkins 自動化部署並上傳映象Spring BootDockerJenkins
- 使用 Docker 部署 vue 專案DockerVue
- 使用 Docker 部署 Angular 專案DockerAngular
- 基於Java11最小化Spring Boot 2 的Docker映象檔案配置JavaSpring BootDocker
- docker映象體積優化方法與實踐Docker優化
- 用 Docker 部署前端?你有私有映象倉庫嗎Docker前端
- Docker的映象使用-WindowDocker
- Docker的minio檔案伺服器部署【嘿】Docker伺服器
- 釋出 .NET 5 帶執行時單檔案應用時優化檔案體積的方法優化
- Java應用Docker化部署GC變長的踩坑經歷JavaDockerGC
- Citypos專案的docker化部署實踐Docker
- Azure Devops實踐(5)- 構建springboot專案打包docker映象及容器化部署devSpring BootDocker