我在 Node 应用程序中定义了一个 Express.js 服务器,如下所示:
const express = require('express')
const SignRequest = require('./SignRequest/lambda/index.js')
const VerifyResponse = require('./VerifyResponse/lambda/index.js')
const port = "3000";
const app = express();
app.set('port', port)
app.use(express.static('../../web/dist'))
app.post('/signrequest', SignRequest.handler)
app.post('/verifyresponse', VerifyResponse.handler)
app.listen(port, () => console.log(`Listening on port ${port}`))
如果我通过
node api/src/server.js
在 IDE(VS Code)本地运行该应用程序,则该应用程序可以正常工作。
当我将其构建到 Docker 时,如下所示:
docker build --no-cache -t sdk-tester .
然后运行如下:
docker run -p 3000:3000 app-name
图像/容器已正确构建并正在运行,没有任何错误。
但是当我尝试在 Docker 之外访问它时(即通过 http://localhost:3000/ 在本地计算机的浏览器上),我收到此错误:
Cannot GET /
这是我的 Dockerfile:
FROM node:16 AS development
ARG NODE_ENV=development
ENV NODE_ENV $NODE_ENV
WORKDIR /code/demo
COPY package.json /code/demo/package.json
COPY package-lock.json /code/demo/package-lock.json
RUN npm install
COPY . /code/demo
RUN update-ca-certificates
RUN export NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/swbc-certificate.crt
CMD [ "node", "api/src/server.js" ]
EXPOSE 3000
我已验证我的所有文件(包括 API 中的
server.js
和 app.use()
引用的 Web 文件确实已成功复制到容器中:
API:
网页:
那么,为什么会出现错误呢?和我在
app.use(express.static('../../web/dist'))
中指定的路径有关系吗?如果是这样,为什么该路径在本地有效,但在 Docker 中却无效?
好吧......看来问题出在我如何在
express.static()
中构建/传递静态文件的路径。如下修改我的server.js
解决了这个问题。
之前:
app.use(express.static('../../web/dist'))
之后:
const path = require('path')
app.use('/', express.static(path.join(__dirname, '../../web/dist')))