【问题标题】:docker-compose stops immediately after starting react app created using create-react-appdocker-compose 在启动使用 create-react-app 创建的 react 应用程序后立即停止
【发布时间】:2020-03-22 16:08:09
【问题描述】:

我正在尝试使用create-react-app 工具创建一个反应应用程序,如here 所述。

我想使用 docker-compose 在 docker 容器中运行 react 应用程序。我已采取以下步骤:

在我的机器上,我创建了一个目录调用 app 并运行了一个 nodejs docker 容器:

mkdir app
docker run -it --rm -v "$(pwd)/app:/app" -w /app -p 3000:3000 node:13.10.1 bash

在容器中,我初始化我的 react 应用并启动我的应用:

npx create-react-app .
yarn start

当我在浏览器中打开http://localhost:3000/#/ 时,我可以看到默认的反应页面。

接下来,我停止yarn start 并退出容器。

在我的机器上,我可以通过运行以下命令来启动 react 应用:

docker run -it --rm -v "$(pwd)/app:/app" -w /app -p 3000:3000 node:13.10.1 yarn start

当我在浏览器中打开 http://localhost:3000/#/ 时,我再次可以看到默认的反应页面。

接下来,我通过停止 docker 容器来停止 react 应用程序。

最后,我创建了以下docker-compose.yml 文件:

version: '3.7'
services:
    test-create-react-app:
        image: node:13.10.1
        volumes:
            - ./app:/app
        working_dir: /app
        ports:
            - 3000:3000
        command: ["yarn", "start"]

当我使用 docker-compose 启动 docker 容器时,容器启动然后立即停止:

➜  test-create-react-app docker-compose up
Creating network "test-create-react-app_default" with the default driver
Creating test-create-react-app_test-create-react-app_1 ... done
Attaching to test-create-react-app_test-create-react-app_1
test-create-react-app_1  | yarn run v1.22.0
test-create-react-app_1  | $ react-scripts start
test-create-react-app_1  | ℹ 「wds」: Project is running at http://172.21.0.2/
test-create-react-app_1  | ℹ 「wds」: webpack output is served from 
test-create-react-app_1  | ℹ 「wds」: Content not from webpack is served from /app/public
test-create-react-app_1  | ℹ 「wds」: 404s will fallback to /
test-create-react-app_1  | Starting the development server...
test-create-react-app_1  | 
test-create-react-app_1  | Done in 1.31s.
test-create-react-app_test-create-react-app_1 exited with code 0

有人可以解释为什么在使用docker-compose 启动 Docker 容器时应用程序会停止吗?

以下一些版本可能会帮助您找到问题:

Docker 版本:

➜  test-create-react-app docker version
Client:
 Version:           19.03.6
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        369ce74a3c
 Built:             Fri Feb 28 23:45:43 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          19.03.6
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       369ce74a3c
  Built:            Wed Feb 19 01:06:16 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.3.3-0ubuntu1~18.04.1
  GitCommit:        
 runc:
  Version:          spec: 1.0.1-dev
  GitCommit:        
 docker-init:
  Version:          0.18.0
  GitCommit:

Docker 撰写版本:

➜  test-create-react-app docker-compose version
docker-compose version 1.25.0, build 0a186604
docker-py version: 4.1.0
CPython version: 3.7.4
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

React 应用程序包:

➜  test-create-react-app cat app/package.json
{
  "name": "app",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^4.2.4",
    "@testing-library/react": "^9.3.2",
    "@testing-library/user-event": "^7.1.2",
    "react": "^16.13.1",
    "react-dom": "^16.13.1",
    "react-scripts": "3.4.1"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

【问题讨论】:

  • react-scripts 3.4.1 有问题,但 3.4.0 没有。这是issue
  • tty: true 添加到您的 docker-compose.yaml
  • tty: true 为我做了。谢谢@alex
  • 我不确定它会不会:D 因为它有效,我会写一个答案:)

标签: reactjs docker docker-compose create-react-app


【解决方案1】:

stdin_open: true 添加到 docker-compose 文件为我解决了这个问题。这是在相应的github issue 中提出的。

【讨论】:

【解决方案2】:

根据docker run docs

在前台模式下...docker run 可以在容器中启动进程并将控制台附加到进程的标准输入、输出和标准错误。它甚至可以伪装成 TTY(这是大多数命令行可执行文件所期望的)并传递信号。

对于 docker-compose.yaml,类似的 docker run 对应物是 tty: true。因此,您应该将tty: true 添加到您的docker-compose.yaml 中,这样就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2013-07-19
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多