如何在 docker-compose 中制作 React 应用程序?构建步骤完成后容器正在退出

Posted

技术标签:

【中文标题】如何在 docker-compose 中制作 React 应用程序?构建步骤完成后容器正在退出【英文标题】:How do I make a react app in docker-compose? Container is exiting after build steps are complete 【发布时间】:2020-12-20 18:39:03 【问题描述】:

我正在尝试在 docker-compose 中制作一个简单的反应应用程序。我正在使用这个reference 我所做的是运行npx create-react-app frontend 来生成默认的反应应用程序。然后我添加了 Dockerfile。这都在一个目录frontend

#Dockerfile

FROM node:14.9

# 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 ./
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"]

在上面的目录中,我有我的 docker-compose

#docker-compose.yml

version: '3.7'

services:

  frontend:
    container_name: frontend
    build: ./frontend
    volumes:
      - './frontend:/app'
      - '/app/node_modules'
    ports:
      - 3000:3000
    environment:
      - CHOKIDAR_USEPOLLING=true

我运行 docker-compose up --build 并在正常构建过程后收到此消息。

docker-compose up --build
Building frontend
Step 1/9 : FROM node:14.9
 ---> 1b2c72215052
Step 2/9 : WORKDIR /app
 ---> Using cache
 ---> 2bab04404275
Step 3/9 : ENV PATH /app/node_modules/.bin:$PATH
 ---> Using cache
 ---> ff4ce5f5ec47
Step 4/9 : COPY package.json ./
 ---> Using cache
 ---> b1d25c0b6c05
Step 5/9 : COPY package-lock.json ./
 ---> Using cache
 ---> 5b829feaf00d
Step 6/9 : RUN npm install --silent
 ---> Using cache
 ---> 835367c47253
Step 7/9 : RUN npm install react-scripts@3.4.1 -g --silent
 ---> Using cache
 ---> 015ccb2db237
Step 8/9 : COPY . ./
 ---> Using cache
 ---> e4a5285339b5
Step 9/9 : CMD ["npm", "start"]
 ---> Using cache
 ---> 3f91b16d34d6

Successfully built 3f91b16d34d6
Successfully tagged projectname_frontend:latest
Recreating frontend ... done
Attaching to frontend
frontend    |
frontend    | > frontend@0.1.0 start /app
frontend    | > react-scripts start
frontend    |
frontend    | ℹ 「wds」: Project is running at http://172.29.0.2/
frontend    | ℹ 「wds」: webpack output is served from
frontend    | ℹ 「wds」: Content not from webpack is served from /app/public
frontend    | ℹ 「wds」: 404s will fallback to /
frontend    | Starting the development server...
frontend    |
frontend exited with code 0

似乎容器只是退出而没有错误消息。我不知道是什么原因造成的。 Docker version 19.03.12, build 48a66213fe

值得注意的是,在过去的几个月里,在没有以下解决方案的情况下,我已经能够成功构建我的 react 应用程序。对解决方案中给出的命令的需求直到最近才成为我的一个问题。

【问题讨论】:

【参考方案1】:

这个简单的Dockerfile 总是对我有用:

FROM node:10
 
WORKDIR /usr/src/app
 
COPY package*.json ./
 
RUN npm install
 
COPY . .
 
EXPOSE 8083
 
CMD [ "npm", "start" ]

我还想在docker-compose.yml 中的容器中添加stdin_open: true

【讨论】:

【参考方案2】:

我想我解决了这个问题。将stdin_open: true 添加到 docker-compose.yml 是解决方案的一半。我还添加了command: npm start。在此之后,容器停止退出。我认为 Dockerfile 中的命令就足够了。它现在似乎可以工作了。

docker-compose.yml

version: '3.7'

services:

  frontend:
    container_name: frontend
    build: ./frontend
    volumes:
      - './:/app'
      - '/app/node_modules'
    ports:
      - 3000:3000
    stdin_open: true
    environment:
      - CHOKIDAR_USEPOLLING=true
    command: npm start

Dockerfile

FROM node:14.9
 
WORKDIR /usr/src/app
 
COPY package*.json ./
 
RUN npm install
 
COPY . .
 
EXPOSE 3000
 
CMD [ "npm", "start" ]

【讨论】:

谢谢 - 工作 - 简单的解决方案 - usepolling on true 是什么意思? github.com/paulmillr/chokidar#performance 这个有解释。我最终没有在生产应用程序中将其设置为 true【参考方案3】:
version: "3.8"
services:
  frontend:
    build: .
    container_name: your-container-name
    ports: 4300:4300
    volumes: 
      - ./src:/app/src
      - ./public/assets:/app/public/assets
      - /app/node_modules
    stdin_open: true
    tty: true
    env-file:
      - location/to/your/env-file

【讨论】:

以上是关于如何在 docker-compose 中制作 React 应用程序?构建步骤完成后容器正在退出的主要内容,如果未能解决你的问题,请参考以下文章

如何获得正确的 docker-compose Multiline 环境变量格式?

在 docker-compose.yml 中重用环境变量

TesseractNotFoundError:两个Docker容器python应用程序(docker-compose)

Docker系列- Docker-compose使用与负载均衡

docker-compose启动MySQL并配置远程登录

如何让我的 Vigenère Cipher 忽略原始消息中的空格