You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需Dockerfile:Docker容器装Node.js依赖不生成主机node_modules且停后销毁

解决Docker-Compose启动后本地生成空node_modules及容器停后依赖自动销毁问题

问题背景

现有如下docker-compose配置:

version: "3.5"

services:

  FronServer:

    image: node:16-alpine
    container_name: Example-Production-FrontServer

    working_dir: /var/www/example.com

    volumes:
      - .:/var/www/example.com
      - FrontServerDependencies:/var/www/example.com/node_modules:nocopy

    command: sh -c "echo 'Installing dependencies ...' \
        && npm install --no-package-lock \
        && node FrontServerEntryPoint.js --environment production"

    ports: [ "8080:8080" ]
    environment:
      - DATABASE_HOST=Database

    depends_on: [ Database ]

  Database:

    image: postgres
    container_name: Example-Production-Database
    ports: [ "5432:5432" ]

    environment:
      - POSTGRES_PASSWORD=pass1234

    volumes:
      - DatabaseData:/data/example.com

volumes:
  FrontServerDependencies: { driver: "local" }
  DatabaseData: {}

启动后本地主机会生成空的node_modules目录,需实现:无需额外编写Dockerfile,避免主机生成该目录,且容器停止后安装的node_modules自动销毁。

注:生产构建目录中的package.json与源码的package.json不同,开发依赖无需安装,前端依赖已预打包。

修改后的配置

version: "3.5"

services:
  FronServer:
    image: node:16-alpine
    container_name: Example-Production-FrontServer
    working_dir: /var/www/example.com
    volumes:
      - .:/var/www/example.com
      # 用tmpfs临时挂载替代命名卷,容器停止后自动销毁内容
      - type: tmpfs
        target: /var/www/example.com/node_modules
    command: sh -c "echo 'Installing dependencies ...' \
        # 添加--production参数,只安装生产依赖
        && npm install --no-package-lock --production \
        && node FrontServerEntryPoint.js --environment production"
    ports: [ "8080:8080" ]
    environment:
      - DATABASE_HOST=Database
    depends_on: [ Database ]

  Database:
    image: postgres
    container_name: Example-Production-Database
    ports: [ "5432:5432" ]
    environment:
      - POSTGRES_PASSWORD=pass1234
    volumes:
      - DatabaseData:/data/example.com

volumes:
  DatabaseData: {}

关键修改说明

  • 替换原命名卷为tmpfs临时挂载:tmpfs是基于内存的临时文件系统,挂载到容器内的node_modules路径后,会覆盖绑定挂载中可能在本地生成的空目录,且容器停止时tmpfs内容会自动销毁,不会在主机留下任何文件。
  • 给npm install添加--production参数:匹配生产环境需求,只安装package.json中定义的生产依赖,跳过开发依赖,符合生产构建目录的特性。
  • 删除无用的FrontServerDependencies命名卷配置:因为已经用tmpfs替代,不再需要该持久化卷。

内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:32:37