为啥我不能在 docker 中构建这个 nuxtjs 应用程序,而本地构建工作?

Posted

技术标签:

【中文标题】为啥我不能在 docker 中构建这个 nuxtjs 应用程序,而本地构建工作?【英文标题】:Why can't I build this nuxtjs app inside docker, while local builds work?为什么我不能在 docker 中构建这个 nuxtjs 应用程序,而本地构建工作? 【发布时间】:2018-11-13 21:42:37 【问题描述】:

我正在 Mac 上开发这个 nuxtjs 项目(所有最新最好的),本地构建和生成工作正常。我使用sass-loader 作为开发依赖项,而我的nuxt.config.js 文件与默认文件没有太大区别:

module.exports = 
  head: 
    title: 'temp-www',
    meta: [
       charset: 'utf-8' ,
       name: 'viewport', content: 'width=device-width, initial-scale=1' ,
       hid: 'description', name: 'description', content: 'Nuxt.js project' 
    ],
    link: [
       rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' 
    ]
  ,
  modules: [
    [ 'nuxt-fontawesome', 
      component: 'fa',
      imports: [
         set: '@fortawesome/fontawesome-free-brands' ,
      ]
    ],
  ],
  loading:  color: '#3B8070' ,
  build: 
    extend (config,  isDev, isClient ) 
      if (isDev && isClient) 
        config.module.rules.push(
          enforce: 'pre',
          test: /\.(js|vue)$/,
          loader: 'eslint-loader',
          exclude: /(node_modules)/
        )
      
    
  

然后我像这样创建了一个Dockerfile

FROM node:stretch

ENV NODE_ENV=production
ENV HOST=0.0.0.0

RUN mkdir -p /app
COPY . /app
WORKDIR /app

EXPOSE 3000

RUN npm install
RUN npm run build
CMD ["npm", "start"]

(和适当的.dockerignore)但在构建图像时出现以下错误。

ERROR in ./layouts/default.vue
Module not found: Error: Can't resolve 'sass-loader' in '/app/layouts'
 @ ./layouts/default.vue 2:2-436
 @ ./.nuxt/App.js
 @ ./.nuxt/index.js
 @ ./.nuxt/client.js

在那里和其他.vue 文件中,我在<style lang="scss"> 之类的块中使用sass。我尝试将其更改为sass,但没有任何区别。

奇怪的是,this question 说它应该通过将sass-loadernode-sass 作为运行时部门而不是 devtime 部门来工作。我对此持怀疑态度,但情况变得更糟,直到我将style 块中的lang 属性更改为scss 而不是sass。在这种情况下,并且仅在这种情况下,我正确构建了图像。

我错过了什么?

【问题讨论】:

【参考方案1】:

你必须为 webpack 安装 sass-loader

npm install sass-loader --save-dev

(参见官方文档“如何使用预处理器”(例如 sass):https://nuxtjs.org/faq/pre-processors/)


但是将环境变量 NODE_ENV 设置为“生产”会导致 npm install 忽略 devDependencies。

所以你可以作为主要依赖安装:

npm install sass-loader --save

正确的方法是继续使用作为开发依赖项并在 CI 上构建您的应用,然后使用 NODE_ENV "production" 将其部署到您的生产环境中

【讨论】:

(我使用的是sass-loader)。按照您的建议,我仍然需要包含node_modules 目录,或者至少包含nuxt.config.js 中指定的模块。另一种方法是 generate 并用作静态文件。如果可能的话,我更喜欢使用build 而不是generated 代码。 并且您已经将 sass-loader 安装为依赖项 (--save) 或 devDependency (--save-dev) ?如果你想使用 NODE_ENV “生产”,你必须使用--save,如前所述。关于我的最后一个建议,这只是持续交付“只构建一次二进制文件,随处部署”的理念。使用带有 CI 平台(Jenkins、Travis、GitlabCI)的 node_modules 制作完整的 build,并将其部署到任何地方 :) sass-loader 是一个 devDependency,我正在制作一个 build。正如您所说,问题在于 production 中忽略了 devDependencies - 我没有考虑过,我认为它更像是构建时/运行时的事情。 building 的问题,无论是在本地还是在 CI 中,都在于 webpack 在其配置中有 modules 需要在运行时可用。就我而言,sass 不是问题,因为一旦构建完成,它就完成了。但是,我在 webpack 的模块中有一个模块。没有办法告诉 webpack 将这些模块拉入构建中吗? nuxt generate 似乎做到了。 我很困惑,我在 Docker 中重新做了一个build,但我没有遇到需要在node_modules 中的东西的问题。我昨天一定做错了什么。

以上是关于为啥我不能在 docker 中构建这个 nuxtjs 应用程序,而本地构建工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 NuxtJS 中作为 prop 传递时,图像路径没有被 require() 解析?

部署在 docker 容器中的 Nginx 不会暴露部署在另一个 docker 容器中的 nuxtjs(502 Bad Gateway)

为啥从 NuxtJS 的 Content 模块的 TOC 列表中排除 H1 标签?

Vue & Nuxt Js:为啥不能在字符串'bottom:30px;right:30px;'上创建属性'display'?

为啥 Docker 构建命令在 Elastic Beanstalk 中运行如此缓慢?

为啥 NPMInstall 不能构建这个 node-sass 依赖?