Docker应用程序无法工作,但如果不在Docker中,应用程序可以工作



我已经构建了一个react和node应用程序,它可以工作。我正试图构建一个docker镜像并运行它编译,但当我试图通过浏览器访问它时,它说这个网站无法访问localhost拒绝连接。这是我写的码头文件,因为我认为这就是问题所在:

# pull official base image
FROM node:13.12.0-alpine
# set working directory
WORKDIR /client
# add `/app/node_modules/.bin` to $PATH
ENV PATH /client/node_modules/.bin:$PATH
# install app dependencies
COPY package.json ./
COPY package-lock.json ./
RUN npm install --silent
RUN npm install react-scripts@3.4.1 -g --silent
# add app
COPY . ./
# start app
CMD ["npm", "start"]


FROM node:12
# Create app directory
WORKDIR ./
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./
RUN npm install
# If you are building your code for production
# RUN npm ci --only=production
# Bundle app source
COPY . .
EXPOSE 5000
CMD [ "node", "index.js" ]

首先确保您可以访问服务器-您的应用程序可能在本地运行,但它使用的服务器与dockerfile中的服务器不同,例如npm start启动本地服务器。

从你的dockerfile中删除所有与react应用程序阶段相关的内容,只需确保你可以在5000端口上访问服务器,并且它可以为页面提供服务——你可以用<body>Hello world</body>或其他东西托管一个index.html。当你能够做到这一点时,只需将react应用程序捆绑文件添加到服务器静态(公共(文件夹

您的节点服务器是否正在侦听端口5000?通常,对于nodejs服务器,您必须设置服务器使用的PORT和HOST env变量,如process.env.PORTprocess.env.HOST


其他问题

#启动应用程序
CMD["npm","启动"]

npm start(通常(用于在开发反应应用时启动本地服务器

与其启动应用程序,不如运行一个bundle命令,该命令将生成要托管的静态文件-js-html等。
通常为npm run build

这应该使文件夹./dist./build包含您应该放在服务器上的所有静态内容(也许这是您/客户端的文件夹?(

的一些调整

# pull official base image
FROM node:13.12.0-alpine AS builder
# set working directory
WORKDIR /client
# Copy source
COPY . .
# add `/app/node_modules/.bin` to $PATH (you probably don't need this)
ENV PATH /client/node_modules/.bin:$PATH
# install app dependencies
RUN npm install --silent
RUN npm install react-scripts@3.4.1 -g --silent (you can move this to dependencies)
# Build bundle 
RUN npm run build
# Next stage
FROM node:12
# Create app directory
WORKDIR ./
# Copy source
COPY . .
RUN npm install
# If you are building your code for production
# RUN npm ci --only=production
# Copy js bundle
COPY --from=builder /client/dist ./public
EXPOSE 5000
CMD [ "node", "index.js" ]

这可能需要更多的调整,但这是的总体想法


您不需要全局安装react-scripts,它可以只是一个本地依赖项-npm startnpm build使用它来构建您的应用程序,因此您需要依赖它-它应该是package.json依赖项的一部分

应该不需要将/client/node_modules/.bin添加到PATH中,也许这是一个遗留问题,或者表明其他东西没有正确设置

最新更新