【发布时间】: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就构建了图像。