Docker:绑定装载没有像我预期的那样工作



大多数时候我都将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命令时,我会得到一个构建错误,因为它说/app目录中没有package.json文件。

另一方面,当我使用Dockerfile的另一个版本时

FROM node:8
WORKDIR /app
ADD package.json .
ADD package-lock.json .
RUN npm install
ADD . .
CMD ["npm","start"]

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

事实是,它会说找不到React脚本。这并不奇怪,因为当它完成时,./docker/fe中没有node_modules目录,这是在运行npm install之后预期的。

我很困惑。

  • 我是否遗漏了绑定挂载的一些内容?

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

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

Docker卷仅在映像运行时装入,而不是在构建阶段装入。

将这些添加回Dockerfile:

ADD package.json .
ADD package-lock.json .

和/或:

ADD . .

最新更新