【问题标题】:Unable to run React and Node application with docker-compose up无法使用 docker-compose up 运行 React 和 Node 应用程序
【发布时间】:2020-05-16 18:30:43
【问题描述】:

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

Dockerfile(React 应用)

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

【问题讨论】:

  • 您可以尝试删除 node_modules 文件夹并重新安装吗?
  • volumes: 声明正在覆盖图像的内容,包括 node_modules 树中的二进制文件,其中包含来自主机的不兼容内容。 (您是在 MacOS 还是 Windows 主机上?)尝试删除 volumes: 声明。 (您也不需要expose:links:command:,尤其是当它们在 Dockerfile 中重复指令时。)
  • 我在 Mac OS 上。

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


【解决方案1】:

当您有一个命名主机路径的volumes: 声明时,该主机路径的全部内容将替换映像中内置的任何内容。您在评论中提到您使用的是 MacOS;在这种环境中,Docker 运行在一个隐藏的 Linux 虚拟机中,所以你挂载了一个 MacOS node_modules 目录以在 Linux 环境中运行,这会导致你得到的错误。

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

这意味着您可以从docker-compose.yml 文件中删除volumes: 行,以使用图像中内置的代码。您还可以删除许多其他选项(links:expose: 在现代 Docker 中不使用;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 的开销。

【讨论】:

  • 如果我删除卷,那么对主机源代码所做的更改将如何复制到容器内?
  • 重新运行docker-compose up --build
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 2021-12-30
  • 2018-10-04
  • 1970-01-01
  • 2019-08-28
相关资源
最近更新 更多