【发布时间】:2020-11-12 18:26:06
【问题描述】:
我有一个非常简单的node js 应用,项目结构是这样的。
index.js
package.json
package-lock.json
Dockerfile
FROM node:12.18.2-alpine
WORKDIR /test-app
COPY package.json package-lock.json ./
RUN npm i
COPY . ./
EXPOSE 3000
ENTRYPOINT [ "node", "index.js" ]
docker-compose.yml
version: '3.2'
services:
test-app:
build: .
ports:
- "3000:3000"
volumes:
- .:/test-app
- "test_app_node_modules:/test-app/node_modules"
volumes:
test_app_node_modules:
driver: local
如果您查看docker-compose.yml 文件中的volumes 部分,首先我是bind mounting 我在主机上的当前目录到容器上的test-app 目录。这意味着:
- 我当前目录中的任何文件或目录都将反映在容器目录中,对容器目录所做的任何更改也将反映回主机目录。
- 这意味着在 docker 构建期间安装在容器的
test-app目录中的node_modules也被覆盖了。
volumes 部分的下一步是named volumes。这意味着:
- 它应该将容器内
test-app/node_modules中的所有内容复制到test_app_node_modules卷。但是test-app/node_modules是空的,因为第 1 步覆盖了它。 - 这意味着我们创建了一个空卷并将其安装到容器中。
如果是这样,它应该会导致缺少依赖项错误,但我的应用程序运行正常。我不确定我从哪里得到 node_modules。
另外,我在主机目录中看到一个空的 node_modules 文件夹。我认为这背后的原因是"test_app_node_modules:/test-app/node_modules" 在容器中查找node_modules,但它不存在,因此它创建了一个,因此它被反射回主机目录。
我无法理解卷安装的概念。这里的流程是什么?没有 node_modules 时如何开始将其存储到卷中?
【问题讨论】:
标签: node.js docker docker-compose docker-volume