【问题标题】:React app docker container exits/restarts after executing npm run build command执行 npm run build 命令后 React app docker 容器退出/重新启动
【发布时间】:2021-11-30 06:43:54
【问题描述】:

Dockerfile:

FROM node:14

WORKDIR /code 

COPY ./code/package.json ./code/package-lock.json /code/

RUN npm install 

COPY ./code /code

CMD [ "npm", "run", "build"]

docker-compose.yml:

version: '3'

services:
  medace-lecture-capsules:
    build: ./app
    container_name: medace-lecture-capsules
    restart: always
    expose:
      - "3000"
    networks:
      - shared

networks:
  shared:
    external:
      name: shared

码头工人撰写日志:

Attaching to medace-lecture-capsules
medace-lecture-capsules    | 
medace-lecture-capsules    | > medace-frontend-lecture-capsules@0.1.0 build /code
medace-lecture-capsules    | > react-scripts build
medace-lecture-capsules    | 
medace-lecture-capsules    | Creating an optimized production build...
medace-lecture-capsules    | Compiled successfully.
medace-lecture-capsules    |   
medace-lecture-capsules    | File sizes after gzip:
medace-lecture-capsules    | 
medace-lecture-capsules    |   130.34 KB  build/static/js/2.dd4b4a7b.chunk.js
medace-lecture-capsules    |   3.83 KB    build/static/js/main.725c12bb.chunk.js
medace-lecture-capsules    |   970 B      build/static/css/main.aae65096.chunk.css
medace-lecture-capsules    |   791 B      build/static/js/runtime-main.15e7259b.js
medace-lecture-capsules    | 
medace-lecture-capsules    | The project was built assuming it is hosted at /.
medace-lecture-capsules    | You can control this with the homepage field in your package.json.
medace-lecture-capsules    | 
medace-lecture-capsules    | The build folder is ready to be deployed.
medace-lecture-capsules    | You may serve it with a static server:
medace-lecture-capsules    | 
medace-lecture-capsules    |   npm install -g serve
medace-lecture-capsules    |   serve -s build
medace-lecture-capsules    | 
medace-lecture-capsules    | Find out more about deployment here:
medace-lecture-capsules    | 
medace-lecture-capsules    |   https://cra.link/deployment
medace-lecture-capsules    |  

我使用了 docker-compose build,然后是 docker-compose up -d,但是容器在创建构建后以某种方式设法退出。我想运行生产服务器,这就是我使用 npm run build 的原因。 尝试了 serve -s build 但在加载网页时最终出现 404 错误。

【问题讨论】:

    标签: reactjs docker docker-compose dockerfile


    【解决方案1】:

    您的命令似乎是您的编译命令。

    容器的 CMD 命令必须是可以永远运行的东西

    CMD node app.js
    

    或者也许 CMD npm 启动

    另外..与您的问题无关的东西,如果您使用 npm install 我认为您的锁定文件将被忽略并重新生成。要准确安装锁定文件中的内容,请使用

    RUN npm ci
    

    抱歉 - 告诉你为什么它不能在我的手机上工作比告诉你如何让它工作更容易

    FROM node:14
    WORKDIR /code 
    COPY ./code/package.json ./code/package-lock.json /code/
    RUN npm ci # install what is in lock file no package file 
    COPY ./code /code
    RUN npm run build
    RUN npm install -g serve
    CMD serve -s build 3000
    

    然后如果你想尝试本地服务,你可以在你的项目中添加npm install serve并保存包和包锁文件,然后你不必在你的容器中全局安装serve所以它变成了:

    FROM node:14
    WORKDIR /code 
    COPY ./code/package.json ./code/package-lock.json /code/
    RUN npm ci # install what is in lock file no package file 
    COPY ./code /code
    RUN npm run build
    # the port for the following should match the one you are exposing with docker compose:
    CMD ./node_modules/.bin/serve -s build 3000
    

    将依赖项 serve 添加到项目后

    【讨论】:

    • 您可以做的是将构建命令从 CMD 转换为 RUN 并添加此依赖项 npmjs.com/package/http-server 并作为您的 CMD,该命令将永远运行,使用 http-server 将您的 dist 目录服务于正确的端口
    • 值得研究的母亲选项是因为您在运行时似乎不需要节点,只是为了编译是一个多阶段 docker build,其中节点容器仅用于编译,然后是 dist目录被复制到 nginx 或 Apache 容器中以提供静态文件docs.docker.com/develop/develop-images/multistage-build
    • 实际上,您那里的构建命令的输出建议使用serve 而不是http-serve
    • 感谢您澄清问题和补充说明。
    • 并且目录是dist not build。给我一秒钟。我会用我的“微型计算机”来回答这个问题
    猜你喜欢
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2021-05-28
    • 2020-03-22
    • 2021-07-27
    相关资源
    最近更新 更多