大多数时候我都将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 . .