如何在不本地存储node_modules的情况下使用Docker正确设置Node.js应用程序?

问题描述 投票:0回答:1

我是 Docker 和 Node.js 新手,我正在尝试使用 Docker 设置 Node.js 应用程序。我更喜欢使用 Docker 而不是

nvm
来管理我的 Node.js 版本。这是我面临的问题:

我已采取的步骤

  1. 初始 Dockerfile 设置

    • 在我的项目目录中创建了一个
      Dockerfile
      ,内容如下:
      Dockerfile FROM node:14 USER node WORKDIR /app
    • 构建并运行容器,使用
      -v ${PWD}:/app
      映射卷。
    • 使用
      docker exec
      在容器上打开外壳。
    • Ran
      npm init --yes && npm i mongoose
      ,它在容器和我的本地存储库中创建了
      node_modules
  2. 修改后的Dockerfile:

    • 更新了
      Dockerfile
      以执行
      npm install
      、公开端口并添加其他必要的命令。这个设置工作正常,但它在我的本地目录中留下了一个
      node_modules
      文件夹。

替代方法

  • 我没有使用shell来执行
    npm init
    npm install
    ,而是直接写了一个
    package.json
    文件。
  • 使用
    Dockerfile
    FROM
    WORKDIR
    COPY
    创建了标准
    EXPOSE
    。我没有包含
    CMD
    ,因为还没有要运行的 JS 文件。
  • 这引发了一个问题:运行容器后,目录中未创建
    node_modules
    文件夹。我怀疑这是由于使用
    -v ${PWD}:/app
    安装卷造成的。

问题

如何使用 Docker 正确设置 Node.js 应用程序,以便在容器内创建并使用

node_modules
文件夹,而不将其存储在本地?

谢谢您的帮助!

我尝试过的:

  1. 初始 Dockerfile 设置:

    • 创建了一个基本的
      Dockerfile
      ,内容如下:
      FROM node:14
      USER node
      WORKDIR /app
      
    • 使用以下命令构建并运行容器:
      docker build -t my-node-app .
      docker run -v ${PWD}:/app -it my-node-app
      
    • 在运行的容器中打开一个shell:
      docker exec -it <container_id> /bin/sh
      
    • 冉:
      npm init --yes && npm i mongoose
      
      这在容器和我的本地目录中创建了一个
      node_modules
      文件夹。
  2. 修改后的Dockerfile:

    • Dockerfile
      更新为:
      FROM node:14
      WORKDIR /app
      COPY package*.json ./
      RUN npm install
      COPY . .
      EXPOSE 3000
      CMD ["node", "index.js"]
      
    • 重建并运行容器。此设置有效,但由于卷映射,
      node_modules
      文件夹仍然存在于我的本地目录中。
  3. 替代方法:

    • 直接使用所需的依赖项编写了
      package.json
      文件。
    • 创建了标准
      Dockerfile
      FROM node:14
      WORKDIR /app
      COPY package*.json ./
      RUN npm install
      COPY . .
      EXPOSE 3000
      CMD ["node", "index.js"]
      
    • 使用以下命令运行容器:
      docker build -t my-node-app .
      docker run -v ${PWD}:/app -it my-node-app
      
    • 这次,
      node_modules
      文件夹没有在我的本地目录中创建,但它在容器中也不可用。

我的期望:

我希望在 Docker 容器内创建并使用

node_modules
文件夹,而不是出现在我的本地目录中。这样,我可以管理容器内的依赖关系,保持本地工作区干净。我正在寻找解决方案来实现这一目标。

node.js docker docker-compose development-environment docker-volume
1个回答
0
投票

你是对的,node_modules 不应该像其他语言一样存储:

  • /bin (dll) 用于 c#
  • /目标(jar)java

您的方法 #3 是正确的,只是不要安装该卷。

尽可能清洁

你的 Dockerfile 可以像这样简单

FROM node:22
WORKDIR /opt/
COPY . /opt/
RUN npm install
RUN npm run build
EXPOSE 8080
ENTRYPOINT ["npm","run","start"]

不要安装任何东西

你可以在本地主机上做任何你需要做的事情,但对于服务器上真正的nodejs应用程序,你的容器应该是可移植的和一次性的,因此磁盘不应该用作数据源(json,xml,数据)或文件存储库(csv,报告, pdf、日志等)。

  • 如果您需要存储文件,我建议您使用一些专门的服务,例如 aws s3、azure blob、gcp 云存储等。
  • 对于数据,你有很多引擎(mysql、postgres 等)。
  • 对于日志:aws cloud watch、gcp(Cloud Logging、Stackdriver)等

参考文献

© www.soinside.com 2019 - 2024. All rights reserved.