尝试使用多阶段构建将开发阶段图像与生产阶段构建分开
Trying to separate dev stage image from prod stage build using mult-stage building
嗯,这是我使用 Typescript + ExpressJS[=47 构建的 Node.js 应用程序=],现在我正在尝试设置 docker 以同时拥有工作开发容器和生产容器。
我 喜欢只有一个 Dockerfile 以便使用多阶段构建过程。
我的项目由根文件夹组成,里面有所有这些docker文件和撰写文件,还有我的package.json,src/文件夹,yarn.lock等等
现在我有这个:
Dockerfile
FROM node:14.18.1-alpine3.14 as base
ENV APP=/app
WORKDIR $APP
COPY . $APP/
RUN yarn install --frozen-lockfile &&\
rm -rf "$(yarn cache dir)"
RUN yarn build
FROM base as prod
ENV APP=/home/node/app
WORKDIR $APP
RUN chown node:node $APP
USER node
COPY --chown=node:node --from=base ./app/dist/ $APP/dist/
COPY --chown=node:node package.json yarn.lock $APP/
RUN NODE_ENV=production yarn install --frozen-lockfile &&\
rm -rf "$(yarn cache dir)"
如果我只构建基础阶段,这就是我得到的图像:
355.65 MB 的图像大小。
现在,如果我检查图像中的 node_modules
有多大,这是:
这对开发人员来说没问题 node_modules。
使用 dive
检查图层,我得到这些:
您可以看到这 355 MB 中有 237 MB 是 node_modules 文件夹。
现在,制作部分。
如果我构建到 docker 文件的 prod
目标,那就是我的图像大小:
这甚至比开发者更大。
检查该图像内部的 node_modules 大小:
文从 237 到只有 36 MB,真不错
但现在如果我检查该图像的图层,结果如下:
237 MB node_modules 仍然存在,这几乎是整个图像的大小。我怎样才能避免在我的生产图像中出现这种问题?没有它,结果图像应该只有 80 MB,真的比 391 好。
请帮帮我!!!
刚刚通过将 FROM base as prod
替换为 FROM node:14.18.1-alpine3.14 as prod
解决了问题。第一种方法是在最终构建中缓存所有基础层。
嗯,这是我使用 Typescript + ExpressJS[=47 构建的 Node.js 应用程序=],现在我正在尝试设置 docker 以同时拥有工作开发容器和生产容器。
我 喜欢只有一个 Dockerfile 以便使用多阶段构建过程。
我的项目由根文件夹组成,里面有所有这些docker文件和撰写文件,还有我的package.json,src/文件夹,yarn.lock等等
现在我有这个:
Dockerfile
FROM node:14.18.1-alpine3.14 as base
ENV APP=/app
WORKDIR $APP
COPY . $APP/
RUN yarn install --frozen-lockfile &&\
rm -rf "$(yarn cache dir)"
RUN yarn build
FROM base as prod
ENV APP=/home/node/app
WORKDIR $APP
RUN chown node:node $APP
USER node
COPY --chown=node:node --from=base ./app/dist/ $APP/dist/
COPY --chown=node:node package.json yarn.lock $APP/
RUN NODE_ENV=production yarn install --frozen-lockfile &&\
rm -rf "$(yarn cache dir)"
如果我只构建基础阶段,这就是我得到的图像:
355.65 MB 的图像大小。
现在,如果我检查图像中的 node_modules
有多大,这是:
dive
检查图层,我得到这些:
现在,制作部分。
如果我构建到 docker 文件的 prod
目标,那就是我的图像大小:
请帮帮我!!!
刚刚通过将 FROM base as prod
替换为 FROM node:14.18.1-alpine3.14 as prod
解决了问题。第一种方法是在最终构建中缓存所有基础层。