【发布时间】:2020-05-19 21:46:30
【问题描述】:
我有以下 Dockerfile:
# Use NodeJS base image
FROM node:12
# Create app directory
#RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json /usr/src/app/
COPY src/. /usr/src/app # this is to copy contents of src/ one level up otherwise they aren't recognised
RUN npm install
# Bundle app source
COPY . /usr/src/app/
#RUN rm -f /usr/src/app/src/*
EXPOSE 8080
# Define the Docker image's behavior at runtime
CMD ["node", "server.js"]
但是在构建成功后运行 docker 镜像时,会出现以下错误:
internal/modules/cjs/loader.js:965
throw err;
^
Error: Cannot find module '/usr/src/app/server.js'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:962:15)
at Function.Module._load (internal/modules/cjs/loader.js:838:27)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at internal/main/run_main_module.js:17:47 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
因为我有一个 server.ts 文件,而 docker 正在以某种方式寻找 server.js。在更改扩展名时,它无法导入其他打字稿文件。下面是我的 server.ts:
import cors from 'cors';
import express from 'express';
import {sequelize} from './sequelize';
import {IndexRouter} from './controllers/v0/index.router';
import bodyParser from 'body-parser';
import {config} from './config/config';
import {V0_FEED_MODELS} from './controllers/v0/model.index';
(async () => {
await sequelize.addModels(V0_FEED_MODELS);
//await sequelize.addModels(V0_USER_MODELS);
await sequelize.sync();
const app = express();
const port = process.env.PORT || 8080;
app.use(bodyParser.json());
app.use(cors({
allowedHeaders: [
'Origin', 'X-Requested-With',
'Content-Type', 'Accept',
'X-Access-Token', 'Authorization',
],
methods: 'GET,HEAD,OPTIONS,PUT,PATCH,POST,DELETE',
origin: config.url,
}));
app.use('/api/v0/', IndexRouter);
// Root URI call
app.get( '/', async ( req, res ) => {
res.send( '/api/v0/' );
} );
// Start the Server
app.listen( port, () => {
console.log( `server running ${config.url}` );
console.log( `press CTRL+C to stop server` );
} );
})();
为什么 docker 会自动获取 server.js?我在哪里可以配置 docker 来做其他事情?
【问题讨论】:
-
这是获取 server.js 的地方:
CMD ["node", "server.js"]。 -
你已经设置了工作目录,复制源代码时不需要再次指定完整路径,复制命令的目的地只能是一个点。
标签: javascript typescript docker containers