【问题标题】:can't run react app with docker container无法使用 docker 容器运行反应应用程序
【发布时间】:2020-07-17 17:54:59
【问题描述】:

我有一个 react-app,它简单地显示 hello-world 消息,但我喜欢通过 docker-container 运行该应用程序,但遇到了这个问题。在此消息之后,进程停止而没有运行应用程序..

ℹ 「wds」: Project is running at http://172.17.0.2/
ℹ 「wds」: webpack output is served from
ℹ 「wds」: Content not from webpack is served from /app/public
ℹ 「wds」: 404s will fallback to /
 Starting the development server...

无法理解我应该做什么,因为我的应用程序非常小,Dockerfile 中有基本代码

FROM node:alpine
RUN mkdir /app
COPY . /app
WORKDIR /app
COPY package.json ./
RUN npm install
CMD ["npm", "start"]

我是否需要安装 webpack-dev-server,我尝试了但出现版本错误,例如“手动添加的服务器”的版本低于现有服务器。所以我重新安装了 webpack-dev-server。

我已经使用“create-react-app”创建了应用程序,所以我认为每个依赖项都是自动管理的。 有谁知道,我该如何解决这个问题..提前谢谢(顺便说一句..)

我用来构建的命令:docker build . -t lucki

运行镜像的命令:docker run -p 3000:3000 lucki

这是项目结构:

在 Dockerfile 中添加 DEBUG=* 后,我的响应为:

【问题讨论】:

  • 能否也添加您用来调出容器的 docker 命令?
  • 从容器内部可以验证端口 3000 是否被使用?如果没有,我建议检查应用程序启动的默认端口(尽管如果从 create-react-app 创建,默认值为 3000,但我没有看到它被记录)并在 docker run 命令中映射它。
  • 端口 3000 没有被使用,并且没有任何正在运行的容器。有一个名为“Luki”的已停止容器,但是当我尝试运行时,它显示了上面的消息..跨度>
  • 当你说“进程停止”时,你的意思是docker run退出并返回命令行?
  • 我快速尝试了一个新的 react 应用程序,一切都按预期工作。你能分享退出的lucki容器的日志吗?命令:docker logs lucki

标签: reactjs docker create-react-app


【解决方案1】:

问题是如果不是交互式终端,开发模式将无法运行。

更改您的 docker 命令以包含交互式终端:

-it 添加到您的 docker run 命令(-i 交互式,-t 伪 TTY)例如docker run -it -p 3000:3000 your_container

规范问题排查

确保代码在没有 docker 的情况下运行

npm start 在命令行上工作吗?

显示调试信息

DEBUG=* 添加为容器内的环境变量。DEBUG 是一个环境变量,用于控制许多 Node 模块的日志记录。

在你的Dockerfile,添加

ENV DEBUG=*

或者在命令行中,将-e 'DEBUG=*' 添加到您的docker 命令中。

这可能有助于发现以某种方式被吞没的错误消息

直接运行节点

不要运行npm start,而是直接运行您的文件。 例如在你的Dockerfile

CMD ["node", "index.js"]

尝试运行另一个 docker 容器

如果这是您的 docker 设置的问题,运行已知良好的容器可能会帮助您发现它。

docker run --rm -it node:alpine

改进

您的Dockerfile 也可以简化一点。

FROM node:alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
CMD ["npm", "start"]
  • 不需要mkdir,因为WORKDIR 会自动创建目录。
  • package*.json 也将复制 package-lock.json
  • --production 将跳过安装 devDependencies
  • COPY 命令放在最后将更好地利用缓存(除非您的依赖项已更改,否则您不必重新运行npm install

您可能还想使用Tini。 Tini 转发信号,这意味着docker stop 在交互式终端中按 control+c 实际上会立即停止节点进程。

如果您使用的是 Docker 1.13+,请将--init 添加到命令行以转发信号并获取进程。在旧版本上,请按照说明进行操作 in the README

【讨论】:

  • @akazuko 没错,但我认为它可以提供帮助并且太大而无法放入 cmets
  • @Mr.Learner 我已经能够重现您的问题,并在第一行给出了解决方案
  • 对于那些想用 docker-compose 做同样事情的人:stackoverflow.com/a/39150040/2215109
  • 4 个要点非常有帮助。谢谢@Codebling
  • 帮了大忙!
【解决方案2】:

我遇到了同样的问题,通过使用以下命令解决了这个问题

问题原因:- 由于响应项目设置,它需要一个输入触发器来启动服务器,否则它将自动停止

修复:- 使用docker run 命令添加-it

示例:- docker run --name main-app -it -p 3000:3000 main-image-react

【讨论】:

  • 我错过了在示例中添加它,抱歉,我现在更正了
【解决方案3】:

我遇到了同样的问题 当我使用like时它解决了

docker run -it -p 3000:80 <image name>

使用-it 而不是-p-d 解决了这个问题。

【讨论】:

    猜你喜欢
    • 2020-12-30
    • 1970-01-01
    • 2017-08-03
    • 2021-01-05
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多