有一些similar questions,但他们还没有回答为什么即使将dockerfile设置为将node_modules容纳在容器中,docker也仍在仓库中创建空的node_modules
目录?
我想知道为什么在空的主机上创建目录,并考虑到yarn已经在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"
答案 0 :(得分:1)
是的,您的映像构建过程是将节点程序包安装到映像的node_modules
目录中。因此,在构建映像后,该映像包含node_modules
,您可以使用它来运行您的应用程序。
由于在Compose文件中设置了卷,因此您在主机上看到node_modules
。但是,它比您在其他答案中看到的更多。
正在发生的事情是您在第一个卷定义中映射了.:/usr/app
,这意味着您正在将主机上的当前目录映射到容器中的/usr/app
。
这将使用主机上的当前目录覆盖映像中的/usr/app
目录。而且您的主机没有node_modules
目录(除非您也在主机上安装了node_modules),因此您的容器将无法使用此映射,因为您已覆盖/usr/app
并且没有{ {1}}目录中的目录。节点将抛出一个错误,即找不到节点模块。
下一个卷映射解决了这种情况,这实际上是常见的Node开发设置。您创建一个卷node_modules
。请注意,该卷没有主机部分,映射中没有/usr/app/node_modules
,此处只有一个目录。这意味着Docker将从映像中安装:
目录,并将其添加到先前的映射中,在该映射中您将主机目录映射到/usr/app/node_modules
。
因此,由于存在双重映射,因此您将在运行的容器中从主机的当前目录中获得源代码,并从基础映像中获得源代码/usr/app
。
作为副作用,您将在主机的当前目录中看到一个空的node_modules
目录。
答案 1 :(得分:0)
不是Docker专家,但我认为问题是由于您的{p {1}}阻止
volumes
文件。删除行
docker-compose.yml
然后重试