Node.js 使用Docker build为生产创建React应用程序?

Node.js 使用Docker build为生产创建React应用程序?,node.js,reactjs,docker,npm,Node.js,Reactjs,Docker,Npm,我正在使用以下docker文件使用docker build创建React应用程序: # build env FROM node:13.12.0-alpine as build WORKDIR /app ENV PATH /app/node_modules/.bin:$PATH COPY package.json ./ COPY package-lock.json ./ RUN npm ci RUN npm install react-scripts -g RUN npm install --sa

我正在使用以下docker文件使用
docker build
创建React应用程序:

# build env
FROM node:13.12.0-alpine as build
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
COPY package.json ./
COPY package-lock.json ./
RUN npm ci
RUN npm install react-scripts -g
RUN npm install --save @fortawesome/fontawesome-free
RUN apk add nano
RUN apk add vim
COPY . ./
RUN npm run build

# production env
FROM nginx:stable-alpine
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
然而,我相信Dockerfile在这里并不极端重要。在我的源代码中有一个主配置文件,我想将其从
docker映像中删除,以便能够轻松部署我的React应用程序。这会在Dockerfile命令运行npm RUN build时导致编译错误,因为编译器找不到另一个文件引用的文件。对于开发版本,这不是一个问题,因为
npm start
没有那么敏感

我会在最终的应用程序中将配置文件添加为
docker卷
,这样代码就可以毫无问题地找到它。我只是想知道如何处理这样的情况,因为它没有出现在我的道路上较早


另外,请随意评论或优化我的
Dockerfile
,因为我不确定Nginx是否是网站前端应用程序的生产构建方式。

如果您的应用程序当前
需要
配置文件,正如您所注意到的,这类似于在构建时将值“硬编码”到其中。如果您确实需要能够在运行时动态交换另一个配置文件,则需要使用例如
fetch()
来加载它,而不是捆绑它(正如
所要求的那样)

如果在构建时配置东西是好的,那么我还建议查看;然后可以在构建时将合适的值作为环境变量注入

除此之外,如果您正在为Dockerfile寻找评论,从一个Aarni到另一个:

  • 如果在构建以安装东西的过程中需要执行
    npm ci
    warn
    以外的任何操作,则package.json将被破坏<代码>反应脚本
应该是开发人员依赖项,而Font Awesome应该是常规依赖项
  • 您不需要在临时容器中使用
    nano
    vim
    ,即使这样做了,最好是
    apk一步添加它们
  • 您不需要修改生成容器中的路径
  • 使用Nginx是绝对好的

  • 这是我的react docker文件的一个示例。如果你想优化,你可以使用这个

    附言:我是从库伯内特斯那里得到的

    # #############################   Stage 0, Build the app   #####################
    # pull official base image
    FROM node:13.12.0-alpine as build-stage
    # set working directory
    WORKDIR /app
    # add `/app/node_modules/.bin` to $PATH
    ENV PATH /app/node_modules/.bin:$PATH
    # install app dependencies
    COPY package*.json ./
    #RUN npm install
    RUN npm install
    
    # add app
    COPY . ./
    
    #build for production
    RUN npm run-script build
    
    # #### Stage 1, push the compressed  built app into nginx ####
    FROM nginx:1.17
    
    COPY --from=build-stage /app/build/ /usr/share/nginx/html
      
    

    如果Docker没有参与,你会如何处理这个问题?您可能仍然希望
    npm运行build
    ,并让面向生产的服务器提供预构建的文件。这似乎与原始问题中的Dockerfile没有实质性区别,而且似乎没有解决那里提出的配置问题。tenia mis dudas pero esto me ayudo COPY--from=build stage/app/build//usr/share/nginx/html gracias
    # #############################   Stage 0, Build the app   #####################
    # pull official base image
    FROM node:13.12.0-alpine as build-stage
    # set working directory
    WORKDIR /app
    # add `/app/node_modules/.bin` to $PATH
    ENV PATH /app/node_modules/.bin:$PATH
    # install app dependencies
    COPY package*.json ./
    #RUN npm install
    RUN npm install
    
    # add app
    COPY . ./
    
    #build for production
    RUN npm run-script build
    
    # #### Stage 1, push the compressed  built app into nginx ####
    FROM nginx:1.17
    
    COPY --from=build-stage /app/build/ /usr/share/nginx/html