无法使用 node:alpine 在 Docker 容器中运行 React 应用程序的开发版本

IT技术 node.js reactjs docker
2021-05-13 20:40:09

我有一个基于 Facebook 的 React 应用程序create-react-app在开发过程中,我在特定的本地端口 (60001) 上运行它。为了实现这一点,我将package.json部分中的默认start脚本更改为以下内容:scripts

    "start": "set PORT=60001 && react-scripts start",

我现在需要使用相同的端口在 Docker 容器中运行它。在我的 Dockerfile 中,我有以下两个阶段:

FROM node:alpine as build
COPY ./package.json /app/package.json
WORKDIR /app
RUN npm install
RUN rm -f .npmrc

FROM build as build-dev
COPY ./public/ /app/public
COPY ./src/ /app/src
EXPOSE 60001
CMD ["npm", "start"]

请注意,我公开了希望 npm 开发服务器绑定到的容器上的端口。

我按照您的预期构建映像,针对build-dev上面Docker 阶段。

docker build --target build-dev -t my-app:local

然后我像这样运行容器:

docker run -it -p 60001:60001 my-app:local

目的是当我希望我的开发应用程序构建运行时,将我的本地端口 60001 绑定到容器上的同一端口。

当我这样做时,我看到确认 npm 正在运行正确的脚本并且应用程序已经编译。但是,浏览到http://localhost:60001/什么也没给我。只是一个ERR_CONNECTION_REFUSED,好像什么都没有。

我看不出我在这里做错了什么。有任何想法吗?我希望我可以从容器日志中获得一些见解,但是当我运行docker logs这个容器时,我只看到react脚本输出确认我的应用程序已编译。

2个回答

如果您使用docker-compose添加这一行为我解决了问题...

线路是stdin_open: true

这是我的一个基本示例docker-compose.yml

version: "3.7"

services:
  test-app:
    stdin_open: true
    container_name: test-app
    build: .
    ports:
      - "3000:3000"
    volumes:
      - /app/node_modules
      - .:/app

Dockerfile参考示例

FROM node:alpine

WORKDIR /app

COPY package.json yarn.lock ./

RUN yarn install

COPY . .

EXPOSE 3000

CMD ["yarn", "start"]

有关这方面的更多信息,我将查看 github 问题 create-react-app

GitHub 问题


祝你好运!这让我疯狂了几个小时

PS 不确定这将如何在生产版本中保持不变

似乎应用程序与容器本地主机绑定。

尝试调试

docker exec -it <container_id> ash
#then
curl localhost:60001

它应该在本地主机上工作。

要从容器外部访问它,请执行以下操作。

# i think its window syantax
"start": "set PORT=60001 HOST=0.0.0.0 react-scripts start",

或者

"start": "PORT=60001 HOST=0.0.0.0 react-scripts start",

主持人:

默认情况下,开发 Web 服务器绑定到设备上的所有主机名(本地主机、LAN 网络地址等)。您可以使用此变量来指定不同的主机。

高级配置 HOST 选项 react-app