【问题标题】:Cannot find module 'tslib' while dockerizing an Adonis app v5dockerizing Adonis 应用程序 v5 时找不到模块“tslib”
【发布时间】:2020-12-23 17:50:37
【问题描述】:

我正在尝试对使用版本 5 构建的 Adonis 应用程序进行 dockerize。我在启动这个多容器应用程序时遇到了这个错误:

Error: Cannot find module 'tslib'
Require stack:
- /app/node_modules/@adonisjs/redis/build/src/RedisConnection/index.js
- /app/node_modules/@adonisjs/redis/build/src/RedisManager/index.js
- /app/node_modules/@adonisjs/redis/build/providers/RedisProvider.js
- /app/node_modules/@poppinss/utils/build/src/esmRequire.js
- /app/node_modules/@poppinss/utils/build/index.js
- /app/node_modules/@adonisjs/fold/build/src/Ioc/index.js
- /app/node_modules/@adonisjs/fold/build/index.js
- /app/node_modules/@adonisjs/application/build/index.js
- /app/node_modules/@adonisjs/core/build/standalone.js
- /app/server.js
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
at Function.Module._load (internal/modules/cjs/loader.js:725:27)
at Module.require (internal/modules/cjs/loader.js:952:19)
at require (internal/modules/cjs/helpers.js:88:18)
at Object.<anonymous> (/app/node_modules/@adonisjs/redis/build/src/RedisConnection/index.js:12:17)
at Module._compile (internal/modules/cjs/loader.js:1063:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.Module._load (internal/modules/cjs/loader.js:769:14)
at Module.require (internal/modules/cjs/loader.js:952:19)

这是package.json 文件:

{
  "name": "foo-bar-baz",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "build": "node ace build --production",
    "start": "node server.js",
    "dev": "node ace serve --watch",
    "lint": "eslint . --ext=.ts",
    "format": "prettier --write ."
  },
  "devDependencies": {
    "@adonisjs/assembler": "^3.0.6",
    "adonis-preset-ts": "^1.1.0",
    "eslint": "^7.16.0",
    "eslint-config-prettier": "^7.1.0",
    "eslint-plugin-adonis": "^1.0.15",
    "eslint-plugin-prettier": "^3.3.0",
    "pino-pretty": "^4.3.0",
    "prettier": "^2.2.1",
    "typescript": "^4.1.3",
    "youch": "^2.1.1",
    "youch-terminal": "^1.0.1"
  },
  "dependencies": {
    "@adonisjs/core": "^5.0.4-preview-rc-2.1",
    "@adonisjs/lucid": "^10.0.0",
    "@adonisjs/redis": "^5.0.9",
    "@adonisjs/repl": "^1.1.6",
    "@adonisjs/session": "^4.0.6",
    "@adonisjs/shield": "^4.0.3",
    "@adonisjs/view": "^3.1.0",
    "luxon": "^1.25.0",
    "mysql": "^2.18.1",
    "proxy-addr": "^2.0.6",
    "reflect-metadata": "^0.1.13",
    "source-map-support": "^0.5.19"
  }
}

这是docker-compose.yaml 文件:

version: '3.8'

services:
  redis:
    image: redis
    volumes:
      - redis:/data

  mysql:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    env_file: ./env/mysql.env
    volumes:
      - mysql:/var/lib/mysql

  app:
    build:
      context: .
      dockerfile: Dockerfile
    env_file: ./env/app.env
    ports:
      - 80:3333
    depends_on:
      - redis
      - mysql

volumes:
  redis:
  mysql:

这是Dockerfile

FROM node:lts

WORKDIR /app

COPY package*.json ./

RUN npm install --production

COPY build/ .

ENV NODE_ENV=production PORT=3333 HOST=0.0.0.0

EXPOSE ${PORT}

USER node

CMD [ "node", "server.js" ]

如果我删除 --production 并安装所有依赖项,那么一切正常。我不确定我错过了什么。有人能帮助我吗?提前致谢。

【问题讨论】:

  • 构建文件夹是否可能包含一些node_modules(剩菜?),当COPY build/ . 运行时,它们会覆盖npm install 安装的那些。因为npm install 在复制该文件夹之前运行
  • 不,这是不可能的。我一运行node ace build --prod就构建了图像。

标签: node.js docker adonis.js


【解决方案1】:

我已经跟踪堆栈跟踪以查看发生异常的文件 它确实尝试使用tslib 模块

/app/node_modules/@adonisjs/redis/build/src/RedisConnection/index.js

"use strict";
/*
 * @adonisjs/redis
 *
 * (c) Harminder Virk <virk@adonisjs.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.RedisConnection = void 0;
const tslib_1 = require("tslib");

所以可能是@adonisjs/redis 的问题

当您包含 eslint-adonis-plugin(或不带 --production 标志安装)时,tslib 也会被安装,因为它已被解析为 eslint-adonis-plugin 的依赖项并且您不会收到错误

【讨论】:

【解决方案2】:

它似乎与打字稿有关,所以您可能需要在运行node server.js之前转译您的代码

  • 如果您在运行时运行转译器来启动应用程序,那么typescript 和相关包需要在dependencies
  • 如果您预构建应用程序,那么它应该是一个开发依赖项(您似乎就是这种情况)

这是我发现的:

运行以下命令以创建生产版本。

node ace build --production 

在这个阶段,您可以将构建文件夹上传到您的生产服务器,安装依赖项并运行 node server.js 以启动服务器。

所以首先构建,然后复制构建,然后安装依赖项。您不必复制 package*.json 构建为您完成它

#...

# COPY package*.json ./ # remove this

COPY build/ .

RUN npm ci --production # or npm install --production

# ...

CMD [ "node", "server.js" ]

如果安装所有依赖项后一切正常(没有 --production 的 npm install) 您可以将所有依赖项从devDependencies 移至dependencies,然后开始将它们一一移回devDependencies,看看是哪一个导致了问题。


您能否通过将build 文件夹复制到某处然后在其中运行node server.js 来验证一切是否在本地运行。您可以从项目中复制 .env 文件,这样您就不必在本地设置所有 ENV 变量(尽管在这种情况下请确保设置 NODE_ENV=production)。 我们正在复制该文件夹,因此它不会解析父(项目)文件夹中的任何 node_module

我刚刚这样做了,一切正常:

  • npx create-adonis-ts-app hello-world 并创建了与您相同的设置 (package.json)
  • npm run build
  • 在项目外复制构建
  • 从内部运行node server.js
{"level":30,"time":1608752346315,"pid":15784,"hostname":"DESKTOP-98A1RFS","name":"adonis-5-hello-world","msg":"started server on 0.0.0.0:3333"}

【讨论】:

  • 如果您更仔细地查看“Dockerfile”,您会注意到我已经在容器内复制了转译输出。所以这个问题应该没有问题。如果你想知道是哪个包导致了这个错误,那就是“eslint-adonis-plugin”。
  • 能否尝试在本地运行build 看看是否有错误发生。我在生产模式下运行没有问题,我已经用我的步骤更新了答案
  • 本地运行时没有错误。 scp package.json .env ./build &amp;&amp; npm i --prod &amp;&amp; NODE_ENV=production node build/server 工作得很好。
  • 以防万一使用完整的 --production 标志 - 没有 --prod
猜你喜欢
  • 2019-01-14
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 2019-12-30
相关资源
最近更新 更多