16

I'm deploying a dockerized typescript app on AWS. When I run the app container I get a ts-node error Error: Cannot find module 'typescript' which is not clear to me because typescript is defined as a devDependency. These are my package.json dependencies

{
 "name": "app-server",
 "version": "0.0.0",
 "description": "description",
 "author": "Marcello Bardus",
 "license": "MIT",
 "scripts": {
   "build": "tsc -p tsconfig.build.json",
   "format": "prettier --write \"src/**/*.ts\"",
   "start": "ts-node -r tsconfig-paths/register src/main.ts",
   "start:dev": "nodemon",
   "start:debug": "nodemon --config nodemon-debug.json",
   "prestart:prod": "rimraf dist && tsc",
   "start:prod": "node dist/main.js",
   "lint": "tslint -p tsconfig.json -c tslint.json",
   "test": "jest",
   "test:watch": "jest --watch",
   "test:cov": "jest --coverage",
   "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
"test:e2e": "jest --config ./test/jest-e2e.json"
 },
 "dependencies": {
   "@nestjs/common": "^5.4.0",
   "@nestjs/core": "^5.4.0",
   "@nestjs/typeorm": "^5.3.0",
   "@types/mongoose": "^5.3.18",
   "elliptic": "^6.4.1",
   "mongoose": "^5.4.14",
   "object-hash": "^1.3.1",
   "pg": "^7.8.0",
   "randomstring": "^1.1.5",
   "reflect-metadata": "^0.1.12",
   "rimraf": "^2.6.2",
   "rxjs": "^6.2.2",
   "sha2": "^1.0.2",
   "typeorm": "^0.2.13",
   "typescript": "^3.0.1"
 },
"devDependencies": {
  "@nestjs/testing": "^5.1.0",
  "@types/express": "^4.16.0",
  "@types/jest": "^23.3.1",
  "@types/node": "^10.7.1",
  "@types/supertest": "^2.0.5",
  "jest": "^23.5.0",
  "nodemon": "^1.18.10",
  "prettier": "^1.14.2",
  "supertest": "^3.1.0",
  "ts-jest": "^23.1.3",
  "ts-loader": "^4.4.2",
  "ts-node": "^7.0.1",
  "tsconfig-paths": "^3.5.0",
  "typescript": "^3.0.1",
  "tslint": "5.11.0"
},
"jest": {
  "moduleFileExtensions": [
    "js",
    "json",
    "ts"
  ],
"rootDir": "src",
"testRegex": ".spec.ts$",
"transform": {
  "^.+\\.(t|j)s$": "ts-jest"
},
"coverageDirectory": "../coverage",
"testEnvironment": "node"
  }
}

And the Dockerfile

FROM node
WORKDIR /usr/src/app

COPY . /usr/src/app

RUN npm install -g ts-node nodemon
RUN npm install
RUN npm install typescript

EXPOSE 8085

CMD ["nodemon", "."]

I suppose that typescript is installed locally once the container has been built but it's not. Thanks in advance

16
  • try npm i -g typescript in your Dockerfile Commented Feb 26, 2019 at 22:18
  • Didn’t help, but thanks anyway. Commented Feb 26, 2019 at 22:20
  • no problem. Can you include the full package.json in your answer? Commented Feb 26, 2019 at 22:22
  • 1
    ts-node is not really meant for production use. You should transpile your Typescript code into JavaScript, then call node startingPoint.js Commented Feb 26, 2019 at 22:38
  • 1
    @molamk I agree. In nest.js, you can use npm run start:prod which compiles the typescript and then runs the compiled javascript. Commented Feb 26, 2019 at 22:47

3 Answers 3

22

Finally, I got ts-node to work using npx:

  1. Install typescript globally:

    npm i typescript -g
    
  2. Go to your project directory and link typescript to the project:

    cd <my-project>
    
    npm link typescript
    
  3. Execute ts-node using npx:

    npx ts-node <your-ts-script>.ts
    
Sign up to request clarification or add additional context in comments.

Comments

4

I have installed typescript globally using - npm i typescript -g

Still getting the issue - Error: Cannot find module ‘@types/node/package.json‘

Then this helped me to resolve the issue - sudo npm install -D tslib @types/node

After this, I was able to run my script file using either of these -

npx ts-node <script-file>.ts 

OR

ts-node <script-file>.ts

You will get detailed explanation on the official npmjs website - https://www.npmjs.com/package/ts-node

1 Comment

npm i @types/node did the trick for me :)
1

If you plan to use ts-node and nodemon as starting point of your application, then explicitly define them in package.json dependencies.

Then RUN npm install --production

They'll be accesible in node_modules/.bin/

~/foo/node_modules/.bin

> ls
is-ci@    nodetouch@  rc@      ts-node@         ts-node-transpile-only@
nodemon@  nopt@       semver@  ts-node-script@  ts-script@

Then you can run ./node_modules/.bin/nodemon or npx nodemon as your Docker CMD.

npx

Executes either from a local node_modules/.bin, or from a central cache, installing any packages needed in order for to run.

source: npx


Tip to improve your Dockerfile, the right way to cache node_modules.

COPY package*.json /usr/src/app

Note that, rather than copying the entire working directory, we are only copying the package.json file. This allows us to take advantage of cached Docker layers.

Then copy app files

COPY . /usr/src/app

Don't forget .dockerignore node_modules.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.