首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法运行React应用程序并使用docker-组合。

无法运行React应用程序并使用docker-组合。
EN

Stack Overflow用户
提问于 2020-05-16 18:30:43
回答 1查看 188关注 0票数 0

我试图将React.jsNode.js (Express.js)应用程序运行到docker容器中。到目前为止,我已经为React应用程序创建了一个Dockerfile,为Node.js应用程序创建了另一个Dockerfile

Dockerfile(React )

代码语言:javascript
复制
FROM alpine:3.11

RUN apk add --update nodejs npm

RUN mkdir /client
WORKDIR /client

RUN npm install
COPY . /client

RUN npm install --global http-server

CMD [ "http-server"]

Dockerfile(Node )

代码语言:javascript
复制
FROM alpine:3.11

RUN apk add --update nodejs npm

RUN mkdir /server
WORKDIR /server

COPY ./package.json /package.json
COPY ./package-lock.json /package-lock.json

RUN npm install

COPY . /server

CMD [ "node", "server.js"]

我还创建了这样一个docker-compose -

代码语言:javascript
复制
version: '3'

services:
    server:
        build: ./backend
        expose: 
            - 8080
        environment: 
            API_HOST: "http://localhost:8080"
            APP_SERVER_PORT: 8080
        ports: 
            - 8080:8080
        volumes: 
            - ./client
        command: node server.js
    client:
        build: ./build
        environment: 
            -REACT_APP_PORT: 8081
        expose: 
            - 8081
        ports: 
            - 8081:8081
        volumes: 
            - ./server
        links: 
            - server
        command: http-server

我不明白我的配置有什么问题,当我运行时,它抛出了一个错误,如下所示-

代码语言:javascript
复制
Error: Error loading shared library /server/node_modules/hummus/binding/hummus.node: Exec format error
server_1  |     at Object.Module._extensions..node (internal/modules/cjs/loader.js:1021:18)
server_1  |     at Module.load (internal/modules/cjs/loader.js:811:32)
server_1  |     at Function.Module._load (internal/modules/cjs/loader.js:723:14)
server_1  |     at Module.require (internal/modules/cjs/loader.js:848:19)
server_1  |     at require (internal/modules/cjs/helpers.js:74:18)
server_1  |     at Object.<anonymous> (/server/node_modules/hummus/hummus.js:5:31)
server_1  |     at Module._compile (internal/modules/cjs/loader.js:955:30)
server_1  |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)
server_1  |     at Module.load (internal/modules/cjs/loader.js:811:32)
server_1  |     at Function.Module._load (internal/modules/cjs/loader.js:723:14)
pdf_spliter_server_1 exited with code 1
client_1  | Starting up http-server, serving ./
client_1  | Available on:
client_1  |   http://127.0.0.1:8080
client_1  |   http://172.26.0.3:8080
client_1  | Hit CTRL-C to stop the server
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-17 10:45:49

当您有一个命名主机路径的volumes:声明时,该主机路径的全部内容将替换图像中内置的任何内容。您在注释中提到您在MacOS上;在此环境中,Docker运行在隐藏的Linux中,因此您正在安装一个MacOS node_modules目录,以在Linux环境中运行,这将导致您所得到的错误。

标准的Docker模型是一个映像包含一个完整的打包应用程序及其所有依赖项。您应该能够独立地运行映像,而不需要单独使用应用程序源代码。您的Dockerfile有类似于COPY . /server的行,这些行实际上在其中复制了整个应用程序树。

这意味着您可以从volumes:文件中删除docker-compose.yml行,以使用图像中内置的代码。您还可以删除许多其他选项(在现代Docker中不使用links:expose:command:只是重复Dockerfile设置)。这会让你

代码语言:javascript
复制
version: '3'
services:
    server:
        build: ./backend
        environment: 
            API_HOST: "http://localhost:8080"
            APP_SERVER_PORT: 8080
        ports: 
            - 8080:8080
    client:
        build: ./build
        ports: 
            - 8081:3000

您还需要确保您有一个将node_modules排除在Docker上下文之外的node_modules。这将避免覆盖RUN npm install步骤的结果,并减少运行docker build的开销。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61841710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档