Node.js Docker-卷说明

Node.js Docker-卷说明,node.js,docker,Node.js,Docker,据我所知,Docker中的volume是容器的一些永久数据,可以映射本地文件夹和容器文件夹 在早期,我面临着错误:在Docker中找不到模块“winston”问题,其中提到: 有人在这篇帖子里告诉我: 从docker-compose.yml中删除卷:-./:/server。它覆盖容器中包含节点_模块的整个目录 删除卷:-./:/server后,上述问题就解决了。 但是,出现了另一个问题。 我通过添加回卷来解决上述问题:-./:/server,但我不知道这是什么原因 问题 以上两个问题的原因和

据我所知,
Docker
中的
volume
是容器的一些永久数据,可以映射本地文件夹和容器文件夹

在早期,我面临着
错误:在Docker中找不到模块“winston”
问题,其中提到:

有人在这篇帖子里告诉我:

从docker-compose.yml中删除卷:-./:/server。它覆盖容器中包含节点_模块的整个目录

删除
卷:-./:/server
后,上述问题就解决了。

但是,出现了另一个问题。

我通过添加回
卷来解决上述问题:-./:/server
,但我不知道这是什么原因

问题

  • 以上两个问题的原因和解释是什么?
  • 在docker-compose.yml中,
    构建
    之间发生了什么,以及
    构建
    之间的关系是什么
  • Dockerfile

    FROM node:lts-alpine
    
    RUN npm install --global sequelize-cli nodemon
    
    WORKDIR /server
    
    COPY package*.json ./
    
    RUN npm install
    
    COPY . . 
    
    EXPOSE 3030
    
    CMD ["npm", "run", "dev"]
    
    docker-compose.yml

    version: '2.1'
    
    services:
      test-db:
        image: mysql:5.7
        ...
      test-web:
        environment:
          - NODE_ENV=local
          - PORT=3030
        build: .           <------------------------ It takes Dockerfile in current directory
        command: >
          ./wait-for-db-redis.sh test-db npm run dev
        volumes:
          - ./:/server     <------------------------ how and when does this line works?
        ports:
          - "3030:3030"
        depends_on:
          - test-db
    
    版本:“2.1”
    服务:
    测试数据库:
    图片:mysql:5.7
    ...
    测试网站:
    环境:
    -节点_ENV=本地
    -端口=3030
    生成:。
    ./wait-for-db-redis.sh test db npm run dev
    卷数:
    
    -./:/server当您没有任何
    卷时:
    ,您的容器将运行内置到映像中的代码。这很好!但是,容器文件系统与主机文件系统完全分离,并且映像包含应用程序的固定副本。在非Docker环境中构建和测试应用程序后,更改应用程序时,需要重建映像

    如果您在应用程序目录(
    :/server
    )上绑定装载卷,则主机目录的内容将替换映像内容;您在Dockerfile中所做的任何工作都会被完全忽略。这也意味着容器中的
    /server/node\u modules
    是主机上的
    /node\u modules
    。如果主机和容器环境不一致(MacOS主机/Linux容器;Ubuntu主机/Alpine容器;…),则可能存在导致此问题的兼容性问题

    如果您还在
    节点模块
    目录(
    /server/node\u modules
    )上装入匿名卷,则仅在第一次运行容器时才会将映像中的
    节点模块
    目录复制到卷中,然后将卷内容装入容器中。如果更新映像,旧卷内容将优先(对
    package.json的更改将被忽略)

    生成图像时,只有
    build:
    块的内容起作用。没有
    卷:
    已装入,
    环境:
    未设置变量,并且生成环境未连接到
    网络:


    结果是,如果您根本没有卷:

    版本:“3.8”
    服务:
    应用程序:
    生成:。
    端口:['3000:3000']
    
    它与主机环境完全断开连接。如果代码发生更改,则需要重新构建图像。另一方面,您可以
    docker将构建的映像推送到注册表,并在其他地方运行它,而不需要单独的节点副本或应用程序源代码


    如果使用卷装载替换应用程序目录,则映像生成中的所有内容都将被忽略。我看到了一些问题,它们将此问题带到了逻辑范围,并跳过映像构建,只需将主机目录绑定到未修改的
    节点上。在这里使用Docker并没有真正的好处,尤其是对于前端应用程序;安装Node,而不是安装Docker,并使用普通开发工具。

    除了下面由@David Maze给出的精彩答案外,在本报告中,我用一些图表解释了什么是容器,什么是图像。