NodeJS + Typescript + Docker 运行时报错

问题描述

我正在尝试在 NodeJS + Typescript 中对接和 Api,但显然当我配置为使用 docker 运行它时,发生了一些奇怪的事情。

如果我尝试使用 ts-node 提供它,例如: NODE_ENV=development ts-node ./dist/src/index.js 工作正常,但我尝试使用 pm2 它抱怨:

SyntaxError: Cannot use import statement outside a module

以下是我的配置:

ecosystem.config.json

{
  "apps": [
    {
      "name": "server","script": "./dist/src/index.js","instances": "max","autorestart": false,"watch": "./dist/**/*.js","env": {
        "NODE_ENV": "development"
      },"env_production": {
        "NODE_ENV": "production"
      }
    },{
      "name": "server-watcher","script": "yarn start","instances": 1,"watch": "tsconfig.json","env_production": {
        "NODE_ENV": "production"
      }
    }
  ]
}

Dockerfile

FROM node:12-alpine

workdir /server

RUN apk add --no-cache bash
RUN npm install -g pm2
RUN npm install -g typescript


ENV NODE_ENV=production

copY package.json tsconfig.json ./

RUN yarn install

copY . ./

RUN yarn build

CMD [ "pm2-runtime","start","ecosystem.config.json","--only=server" ]

docker-compose.yml

version: '3'

services:
  server:
    build: ./
    image: api-server
    restart: always
    volumes: &appvolumes
      - ./src:/server/src
    ports:
      - ${SERVER_PORT}:${SERVER_PORT}
    environment: &appenv
      SERVER_HOST: ${SERVER_HOST}
      BASE_CLIENT_URL: ${BASE_CLIENT_URL}
      SERVER_PORT: ${SERVER_PORT}
      JWT_SECRET: ${JWT_SECRET}
      JWT_ACCESS_EXPIRATION_MINUTES: ${JWT_ACCESS_EXPIRATION_MINUTES}
      DB_TYPE: ${DB_TYPE}
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
      DB_HOST: ${DB_HOST}
      DB_PORT: ${DB_PORT}
      DB_NAME: ${DB_NAME}
      FACEBOOK_API_KEY: ${FACEBOOK_API_KEY}
      FACEBOOK_API_SECRET: ${FACEBOOK_API_SECRET}
      FACEBOOK_AUTH_CALLBACK: ${FACEBOOK_AUTH_CALLBACK}
      GMAIL_ACCOUNT_USERNAME: ${GMAIL_ACCOUNT_USERNAME}
      GMAIL_ACCOUNT_PASSWORD: ${GMAIL_ACCOUNT_PASSWORD}
      GMAIL_SMTP_HOST: ${GMAIL_SMTP_HOST}
      TWILIO_ACCOUNT_SID: ${TWILIO_ACCOUNT_SID}
      TWILIO_AUTH_TOKEN: ${TWILIO_AUTH_TOKEN}
      TWILIO_SERVICE_SID: ${TWILIO_SERVICE_SID}
      CLIENT_PORT: ${CLIENT_PORT}
      NODE_ENV: ${NODE_ENV}
      MysqL_ROOT_PASSWORD: ${DB_PASSWORD}
      MysqL_USER: ${DB_USERNAME}
      MysqL_PASSWORD: ${DB_PASSWORD}
      MysqL_DATABASE: ${DB_HOST}

  server_watcher:
    build: ./
    image: api-server
    depends_on:
      - server
    restart: always
    volumes: *appvolumes
    environment: *appenv
    command: ['pm2-runtime','start','ecosystem.config.json','--only=server-watcher']

tsconfig.json

{
  "compilerOptions": {
    "baseUrl": "./","rootDir": ".","outDir": "./dist","lib": ["DOM","es2017"],"module": "commonjs","removeComments": false,"moduleResolution": "node","sourceMap": true,"allowJs": true,"strict": true,"esModuleInterop": true,"experimentalDecorators": true,"allowSyntheticDefaultImports": true,"strictPropertyInitialization": false,"declaration": false,"emitDecoratorMetadata": true,"noImplicitAny": true,"target": "es5","strictnullchecks": true,"typeRoots": ["node_modules/@types"]
  },"include": ["src/**/*"],"exclude": ["node_modues","dist/**/*","src/entities/*","src/**/*.spec.ts"]
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)