为什么docker创建空的node_modules以及如何避免它?

时间:2019-01-19 17:10:42

标签: node.js docker

有一些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"

2 个答案:

答案 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

然后重试