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已经给出的,正在更新另一个方法的答案。谢谢。我明白了,非常感谢你的回答。这很有帮助。