我正在尝试将 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
答案 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
的开销。