大多数时候,我将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
目录?
答案 0 :(得分:1)
仅在运行映像时挂载Docker卷,而在 build 阶段不挂载。
将这些重新添加到您的Dockerfile中:
ADD package.json .
ADD package-lock.json .
和/或:
ADD . .