Node.js 通过docker向NodeJ提供静态react应用程序
我为节点设置了目录,并做出如下反应:Node.js 通过docker向NodeJ提供静态react应用程序,node.js,reactjs,docker,Node.js,Reactjs,Docker,我为节点设置了目录,并做出如下反应: Project + client + admin + build + index.html + server_api + server.js + Dockerfile + docker-compose.yml app.get('*', (req, res) => { res.sendFile(path.resolve(__dirname, '../client/admin/', 'b
Project
+ client
+ admin
+ build
+ index.html
+ server_api
+ server.js
+ Dockerfile
+ docker-compose.yml
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, '../client/admin/', 'build', 'index.html'));
});
docker编写文件
server_api:
container_name: speed_react_server_api
build:
context: ./server_api
dockerfile: Dockerfile
image: speed_react/server_api
ports:
- "5000:5000"
volumes:
- ./server_api:/usr/src/app
My server.js从react应用程序中提供静态文件,如下所示:
Project
+ client
+ admin
+ build
+ index.html
+ server_api
+ server.js
+ Dockerfile
+ docker-compose.yml
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, '../client/admin/', 'build', 'index.html'));
});
但它似乎不起作用。
我不想将文件夹客户端
移动到服务器
你能给我建议解决方案吗?更新: @David给出了一个答案,那就是最好用多阶段的方式来塑造Docker的形象 另一种方法是构建唯一的API,因为客户端没有依赖性,所以您可以使用API装载
clinet
server_api:
container_name: speed_react_server_api
image: abc
ports:
- "4001:4001"
entrypoint: sh -c "cd /usr/src/app/server_api/; node server.js"
volumes:
- ./server_api/:/usr/src/app/server_api/
- ./client/:/usr/src/app/client/
您没有提到错误,但我假设脚本没有为发行版提供服务 但似乎您缺少配置 要为静态文件(如图像、CSS文件和JavaScript文件)提供服务,请使用express中的内置中间件函数>
express.static
函数签名为:
express.static(root, [options])
这是完整的脚本
const express = require('express');
const path = require('path');
const app = express();
const PORT=process.env.PORT | 4001
app.use(express.static('../client/admin/build/dist', {
maxAge: '31557600'
}))
var compress = require('compression');
app.use(compress());
app.use('/', express.static('../client/admin/build/dist/', { redirect: false }));
app.get('*', (req, res) => {
res.sendFile(path.resolve('../client/admin/build/dist/index.html'));
});
app.listen(PORT, () => {
console.log(`Incentive frontend is listening on ${PORT}`);
});
您可以根据需要在
Dockerfile
中重新排列文件
请注意,这将需要删除卷:
行,这可能会导致整个Dockerfile大部分被忽略。Docker容器不能用作开发环境。主机节点很容易安装,实时重新加载和交互式调试等功能将更好地工作,所需的配置和调优更少
如果将Dockerfile
向上移动到根目录,它可以访问两个目录树。然后,您可以使用构建客户端,然后将其复制到服务器中。这大概是这样的:
Project
+ client
+ admin
+ build
+ index.html
+ server_api
+ server.js
+ Dockerfile
+ docker-compose.yml
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, '../client/admin/', 'build', 'index.html'));
});
来自节点:14作为客户端
WORKDIR/app
复制client/package.json client/warn.lock。
粗纱机
复制客户端。
长丝织物
从节点:14
WORKDIR/app
复制server_api/package.json server_api/warn.lock。
粗纱机
复制服务器api。
COPY--from=client/app/admin/build admin#感谢您的回答,但您可能误解了我的问题。由于react应用程序不在Dockerfile文件夹中,因此server.js无法读取它。我想要一个解决方案。若react应用程序在节点的文件夹中,它运行良好。哦,明白了,一个答案是@David已经给出的,正在更新另一个方法的答案。谢谢。我明白了,非常感谢你的回答。这很有帮助。