點燈坊

失くすものさえない今が強くなるチャンスよ

如何只安裝 Production 所需 Package 進 Docker ?

Sam Xiao's Avatar 2020-03-15

Node 的一大特色就是需依賴大量的 Package,但有些 Package 只是開發或編譯使用,如 Babel、Nodemon 只會安裝在 devDependencies,像這類 Package 就不須安裝在發布的 Docker Image 內,可大幅降低 Image Size。

Version

macOS Catalina 10.15.3
Docker Desktop 2.2.0.3 (42716)
WebStorm 2019.3.3
Node 12.4.0

Dockerfile

FROM node:lts-alpine
WORKDIR /usr/app
COPY package.json .
RUN yarn install --production
COPY dist/* ./
CMD [ "node", "index.js" ]

第 4 行

RUN yarn install --production

在 docker 內下 yarn install 安裝所有 package 時,別忘了加上 --production,如此只會安裝 dependencies 下的 package,而不會安裝 devDependencies 下的 package,可大幅降低 image 的 size。

Conclusion

  • 實務上常常忘記加上 --production,導致 image 過於肥大,這樣喪失了 NPM 當初設計 dependenciesdevDependencies 的意義