【问题标题】:Why does docker create empty node_modules and how to avoid it?为什么 docker 创建空的 node_modules 以及如何避免它?
【发布时间】:2019-01-19 17:10:42
【问题描述】:

有一些 similar questions,但他们没有回答为什么 docker 会在 repo 中创建空的 node_modules 目录,即使 dockerfile 设置为在容器中保存 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"

【问题讨论】:

  • 您已安装/usr/app/node_modules。删除线,它会工作得很好。是不是故意加了/usr/app/node_modules

标签: node.js docker


【解决方案1】:

您是对的,您的镜像构建过程是将节点包安装到镜像中的node_modules 目录中。因此,在您构建映像后,该映像包含 node_modules,您可以使用它来运行您的应用程序。

您会在主机上看到node_modules,因为您在 Compose 文件中设置了卷。不过,它比您在其他答案中看到的要多。

发生的情况是您在第一个卷定义中映射.:/usr/app,这意味着您将主机上的当前目录映射到容器中的/usr/app

这将使用主机上的当前目录覆盖映像中的/usr/app 目录。并且您的主机没有 node_modules 目录(除非您也在主机上安装了 node_modules),因此您的容器将无法使用此映射,因为您已覆盖 /usr/app 并且没有 node_modules 目录覆盖。节点会抛出找不到节点模块的错误。

下一个volume mapping解决了这个情况,这其实是一个常见的Node开发设置。您创建一个卷 /usr/app/node_modules。注意,这个卷没有主机部分,映射中没有:,这里只有一个目录。这意味着 Docker 将从镜像中挂载 /usr/app/node_modules 目录并将其添加到之前将主机目录映射到 /usr/app 的映射中。

因此,在运行的容器中,由于双重映射,您将拥有来自主机当前目录的源代码以及来自底层映像的 node_modules

您会在主机的当前目录中看到一个空的node_modules 目录。

【讨论】:

  • 谢谢你,这真的很有帮助,在学习这些东西时,随机的空文件夹让你感觉你做错了什么。
  • 感谢您的解释。您是否知道 IDE 是否可以通过硬拷贝方式访问 node_modules
  • 我设法解决了这个问题:stackoverflow.com/a/61137716/8966651
【解决方案2】:

不是 docker 专家,但我认为问题的发生是因为您的

中的 volumes

docker-compose.yml 文件。删除线

 - /usr/app/node_modules

再试一次

【讨论】:

    猜你喜欢
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多