Docker:绑定安装未按预期工作

时间:2018-12-08 17:52:21

标签: reactjs docker docker-compose

大多数时候,我将Docker与卷一起使用。但是,现在我第一次尝试使用绑定安装,但是它们却没有按我预期的那样工作。我可能会丢失某些东西,或者可能无法完全理解它们的工作方式。

让我们举个例子。我有一个用create-react-app创建的React应用,它将与基于MySQL数据库的Rails后端一起运行。

我的目录结构是:

App
├── docker
│   ├── api
│   │   └── Dockerfile
│   └── fe
│       ├── Dockerfile
│       ├── package.json
│       ├── package-lock.json
│       ├── public
│       ├── README.md
│       └── src
├── docker-compose.yml

我首先创建如下的docker-compose.yml文件:

version: "3.7"

services:

  web:
    build: ./docker/fe/.
    ports: ["80:3000"]
    volumes:
      - type: bind
        source: "./docker/fe"
        target: "/app"

您可能会看到,我正在将React前端所在的目录./docker/fe映射到/app

./docker/fe内部是Dockerfile:

FROM node:8

WORKDIR /app

RUN npm install

CMD ["npm","start"]

我希望它能起作用,因为我的应用程序文件都在/app内部,并映射到./docker/fe。至少我以为他们会的!但是,当我在命令行上运行docker-compose up --build命令时,我得到一个构建错误,因为它表示package.json目录中没有/app文件。

另一方面,当我使用其他版本的Dockerfile

FROM node:8

WORKDIR /app

ADD package.json .

ADD package-lock.json .

RUN npm install

ADD . .

CMD ["npm","start"]

此问题不会发生。它将找到package.json文件并正确构建应用程序。但这不会运行!

事实是,它将说找不到React脚本。并不奇怪,因为完成后node_modules内没有./docker/fe目录,就像运行npm install后所期望的那样。

我很困惑。

  • 我是否缺少有关绑定安装的东西?

  • 如果此目录与该文件已经所在的主机目录相关联,为什么我需要将package.json添加到WORKDIR?

  • 为什么在node_modules之后的./docker/fe中没有npm install目录?

1 个答案:

答案 0 :(得分:1)

仅在运行映像时挂载Docker卷,而在 build 阶段不挂载。

将这些重新添加到您的Dockerfile中:

ADD package.json .

ADD package-lock.json .

和/或:

ADD . .