当构建需要从TypeScript编译的映像时,我会遇到此错误:
sh: 1: tsc: 找不到命令
命令'/bin/sh -c npm run tsc'返回非零代码:127
以下是相关代码:
docker-compose.yaml
version: '3.1'
services:
nodeserver:
build:
context: .
target: prod
ports:
- "3000:3000"
volumes:
- ./src:/app/src
- ./public:/app/public
- ./templates:/app/templates
Dockerfile
FROM node:15.11.0 AS base
EXPOSE 3000
ENV NODE_ENV=production
WORKDIR /app
COPY package*.json ./
RUN npm install --only=production && npm cache clean --force
##########################################################################################
FROM base AS dev
ENV NODE_ENV=development
RUN npm install --only=development
CMD npm run dev
##########################################################################################
FROM dev AS source
COPY dist dist
COPY templates templates
COPY public public
RUN npm run tsc
##########################################################################################
FROM base AS test
COPY --from=source /app/node_modules /app/node_modules
COPY --from=source /app/templates /app/templates
COPY --from=source /app/public /app/public
COPY --from=source /app/dist /app/dist
CMD npm run test
##########################################################################################
FROM test AS prod
CMD npm start
包文件.json
{
"name": "nodeserver",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node ./dist/app.js",
"deploy": "git add . && git commit -m Heroku && git push heroku main",
"tsc": "tsc --outDir ./dist",
"dev": "npm run ts-watch",
"test": "npm run jest --runInBand",
"ts-watch": "tsc-watch --project . --outDir ./dist --onSuccess \"nodemon ./dist/app.js\""
},
"jest": {
"testEnvironment": "node"
},
"repository": {
"type": "git",
"url": "git+https://github.com/MiquelPiza/nodeserver.git"
},
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/MiquelPiza/nodeserver/issues"
},
"homepage": "https://github.com/MiquelPiza/nodeserver#readme",
"dependencies": {
"@sendgrid/mail": "^7.4.2",
"bcryptjs": "^2.4.3",
"express": "^4.17.1",
"handlebars": "^4.7.7",
"jsonwebtoken": "^8.5.1",
"lodash": "^4.17.20",
"mongodb": "^3.6.4",
"mongoose": "^5.11.19",
"multer": "^1.4.2",
"socket.io": "^4.0.0",
"validator": "^13.5.2"
},
"devDependencies": {
"@types/bcryptjs": "^2.4.2",
"@types/express": "^4.17.11",
"@types/jsonwebtoken": "^8.5.0",
"@types/lodash": "^4.14.168",
"@types/mongoose": "^5.10.3",
"@types/multer": "^1.4.5",
"@types/node": "^14.14.33",
"@types/sendgrid": "^4.3.0",
"@types/validator": "^13.1.3",
"env-cmd": "^10.1.0",
"jest": "^26.6.3",
"nodemon": "^2.0.7",
"supertest": "^6.1.3",
"tsc-watch": "^4.2.9",
"typescript": "^4.2.3"
},
"engines": {
"node": "15.11.0"
}
}
tsconfig.json
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"strict": true,
"strictNullChecks": false,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
},
"include": ["src"]
}
这个 Dockerfile 是有效的:
FROM node:15.11.0 AS build
WORKDIR /app
COPY package.json .
RUN npm install
ADD . .
RUN npm run tsc
FROM node:15.11.0
WORKDIR /app
COPY package.json .
RUN npm install --production
ADD public ./public
ADD templates ./templates
COPY --from=build /app/dist dist
EXPOSE 3000
CMD npm start
我在参考这个Dockerfile,它来自于一门Docker课程:https://github.com/BretFisher/docker-mastery-for-nodejs/blob/master/typescript/Dockerfile 我不知道我做错了什么,源阶段应该具有开发依赖包,其中包括typescript,所以应该能够运行tsc。
非常感谢任何帮助。
编辑:
除了使用npm ci而不是npm install之外,我还需要将tsconfig.json复制到工作目录(同时复制src目录而不是由tsc创建的dist目录),才能使tsc正常工作。下面是修改后的Dockerfile中的源阶段:
FROM dev AS source
COPY src src
COPY templates templates
COPY public public
COPY tsconfig.json tsconfig.json
RUN npm run tsc
ENV NODE_ENV=production
行移动到RUN npm ci
和RUN npm run build
之间后,解决了我的问题。 - Oren ChapoRUN npm prune --production
。 - dcsan