尝试使用多阶段构建将开发阶段图像与生产阶段构建分开

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 解决了问题。第一种方法是在最终构建中缓存所有基础层。