有一些类似的问题 https://stackoverflow.com/questions/39651908/why-node-modules-is-empty-after-docker-build但他们还没有回答为什么 docker 创建空的node_modules
即使 dockerfile 设置为在容器中保存 node_modules ,存储库中的目录仍然存在吗?
我有兴趣知道为什么在主机上创建空目录,因为纱线已经在容器内安装了包node_modules
以及如何避免它。
## Dockerfile
FROM node:8.11.4-alpine
RUN apk update && apk add yarn
RUN yarn global add nodemon
WORKDIR /usr/app
COPY package.json yarn.lock /usr/app/
RUN yarn
EXPOSE 3000
## docker-compose.yml
version: "3.2"
services:
app:
build:
context: .
dockerfile: Dockerfile
command: nodemon index.js
volumes:
- .:/usr/app
- /usr/app/node_modules
ports:
- "3000:3000"
你是对的,你的镜像构建过程是将节点包安装到node_modules
图像中的目录。因此,在构建图像后,图像包含node_modules
您可以使用它来运行您的应用程序。
You see node_modules
在您的主机上,因为您在 Compose 文件中设置了卷。不过,它的内容比您在其他答案中看到的要多。
发生的事情是你正在映射.:/usr/app
在您的第一个卷定义中,这意味着您将主机上的当前目录映射到/usr/app
在容器中。
这将覆盖/usr/app
镜像中的目录与主机上的当前目录。并且您的主机没有node_modules
目录(除非您也在主机上安装了node_modules),因此您的容器将无法使用此映射,因为您已经覆盖了/usr/app
并且没有node_modules
覆盖中的目录。Node 将抛出找不到节点模块的错误。
接下来的卷映射就解决了这个问题,这实际上是一个常见的 Node 开发设置。您创建一个卷/usr/app/node_modules
。请注意,该卷没有主机部分,因此没有:
在映射中,这里只有一个目录。这意味着 Docker 将挂载/usr/app/node_modules
映像中的目录并将其添加到将主机目录映射到的上一个映射中/usr/app
.
因此,在运行的容器中,您将获得主机当前目录中的源代码以及node_modules
由于双重映射而来自底层图像。
作为副作用,你会看到一个空的node_modules
主机当前目录中的目录。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)