【问题标题】:Why is my Docker Image so large for AstroJS app?为什么我的 Docker Image 对于 AstroJS 应用程序来说如此之大?
【发布时间】:2022-09-26 17:31:31
【问题描述】:

我正在开发一个用 Astrojs 构建的网页。作为前端开发人员,我是相当新手,绝对不是 Docker 方面的专家,但我当前的工作文件夹大小为 270MB,包括依赖项,但当我构建 docker 映像时,它达到 1.32GB

这是我的 package.json 以防万一

{
  \"name\": \"personalsite\",
  \"version\": \"0.0.1\",
  \"private\": true,
  \"scripts\": {
    \"dev\": \"astro dev\",
    \"start\": \"astro dev\",
    \"build\": \"astro build\",
    \"preview\": \"astro preview\",
    \"astro\": \"astro\"
  },
  \"dependencies\": {
    \"@astrojs/image\": \"^0.5.1\",
    \"@astrojs/svelte\": \"^1.0.0\",
    \"@astrojs/tailwind\": \"^1.0.0\",
    \"svelte\": \"^3.50.1\",
    \"@fortawesome/free-brands-svg-icons\": \"^6.2.0\",
    \"@fortawesome/free-solid-svg-icons\": \"^6.2.0\",
    \"@tailwindcss/typography\": \"^0.5.7\",
    \"astro\": \"^1.2.1\",
    \"autoprefixer\": \"^10.4.8\",
    \"daisyui\": \"^2.25.0\",
    \"postcss\": \"^8.4.16\",
    \"svelte-fa\": \"^3.0.3\"
  }
}

这是我的 DockerFile

FROM node:lts-alpine

ENV NODE_ENV=production
WORKDIR /usr/src/app
COPY [\"package.json\", \"package-lock.json*\", \"npm-shrinkwrap.json*\", \"./\"]

RUN yarn install
COPY . .

EXPOSE 3000
RUN chown -R node /usr/src/app
USER node
CMD [\"yarn\", \"run\", \"start\", \"--host\"]

我什至在 Node.js 中使用了 alpine 图像,但它对我来说似乎仍然很大。 你知道这里可能是什么问题吗?

编辑:我按照 cmets 中用户的提示得到了一个多级 dockerfile,但图像大小还是有点大?现在它的大小为 654MB。

我知道这是一个很大的改进,但我仍然感到困惑,因为源代码大小为 60KB(它只是一个带有几个动画的小型个人作品集网站)

这是新更新的 dockerfile,我错过了什么吗?

FROM node:lts as builder

ENV NODE_ENV=production
WORKDIR /usr/src/app
COPY [\"package.json\", \"package-lock.json*\", \"npm-shrinkwrap.json*\", \"./\"]

RUN yarn install --silent --production=true --frozen-lockfile
COPY . .

FROM node:lts-slim 
# I used slim because there were people online who recommended to not 
# mix and match distros and lts-alpine uses a different linux distro

WORKDIR /usr/src/app
COPY --from=builder /usr/src/app /usr/src/app 

EXPOSE 3000
RUN chown -R node /usr/src/app
USER node
CMD [\"yarn\", \"run\", \"start\", \"--host\"]
  • 这是因为您的图像由节点图像和代码文件组成。
  • 这也是我的猜测,但我该如何改变呢?如何在没有代码的情况下运行我的应用程序?
  • 创建一个多阶段 dockerfile。在早期阶段您进行安装,在最后阶段您只复制文件。
  • 用新的 dockerfile 更新了帖子,但它仍然有点大(650MB)
  • /usr/src/app 文件夹有多大?此外 node:lts-alpine 应该小于 node:lts-slim 但我对此并不积极。

标签: node.js docker yarnpkg-v2 astrojs


【解决方案1】:

我意识到,对于我的用例,我只想要 astro build 的输出,这是一堆静态 html 文件,在某些部分带有一些 javascript,因为我没有启用服务器端渲染。

我刚刚将 Dockerfile 完全更改为以下内容,现在它真的很小,只有 9.81MB

# ---> Build stage
FROM node:18-bullseye as node-build

ENV NODE_ENV=production
WORKDIR /usr/src/app
COPY . /usr/src/app/
RUN yarn install --silent --production=true --frozen-lockfile
RUN yarn build --silent

# ---> Serve stage
FROM nginx:stable-alpine
COPY --from=node-build /usr/src/app/dist /usr/share/nginx/html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多