我试图将React.js和Node.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(Node )
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我不明白我的配置有什么问题,当我运行时,它抛出了一个错误,如下所示-
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发布于 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设置)。这会让你
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的开销。
https://stackoverflow.com/questions/61841710
复制相似问题