无法通过docker-compose up运行React和Node应用程序

时间:2020-05-16 18:30:43

标签: node.js reactjs docker docker-compose dockerfile

我正在尝试将 React.js Node.js Express.js )应用程序运行到Docker容器中。到目前为止,我已经为React应用程序创建了一个 Dockerfile ,并且为 Node.js 应用程序创建了另一个 Dockerfile

Dockerfile(反应应用程序)

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(节点应用)

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 -

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

当我运行 docker-compose up 时,我不理解我的配置出了什么问题,它引发了如下所示的错误-

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

1 个答案:

答案 0 :(得分:0)

当您使用volumes:声明来命名主机路径时,该主机路径的全部内容将替换映像中内置的内容。您在评论中提到您使用的是MacOS;在这种环境下,Docker在隐藏的Linux VM中运行,因此您要安装MacOS node_modules目录以在Linux环境中运行,这会导致您得到错误。

标准Docker模型是映像包含整个打包的应用程序及其所有依赖项。您应该能够独立运行映像,而无需单独需要应用程序源代码。您的Dockerfile包含COPY . /server之类的行,实际上可以复制整个应用程序树。

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

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

您还需要确保您有一个.dockerignore file,它从Docker构建上下文中排除了node_modules。这样可以避免覆盖RUN npm install步骤的结果,并减少运行docker build的开销。