docker-compose create volume of my app folder and 运行 node command in it

docker-compose create volume of my app folder and run node command in it

Docker初学者

我正在尝试为本地开发设置 docker。我的最终目标是能够使用“vite”做热模块重载开发服务器。

这是我正在尝试的:

#docker-compose.yml
version: '3.8'
services:
  mpvdb:
    image: mysql:5.7
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=cicd
    ports:
      - 3307:3306
    volumes:
      - db:/var/lib/mysql
      - ./mysql-dump:/docker-entrypoint-initdb.d
  mvpnode:
    image: node:18.1.0
    ports:
      - 4444:4444
    volumes:
      - type: volume
        source: client
        target: /client
    command: sh -c "cd ./client && npm run start"
volumes:
  db:
  client:

请注意,我的存储库中有一个名为 client 的文件夹,我想让节点容器可以访问该文件夹,这样如果我对其进行更改,vite 开发服务器(已启动via npm run start) 将检测变化并执行其操作,最终将应用程序提供给端口 4444。

我面临的问题要么是在我尝试建立客户端卷时,要么是在我的命令脚本中。当我尝试 运行 命令并启动服务器时,我得到以下信息:

mvpnode_1  | npm ERR! code ENOENT
mvpnode_1  | npm ERR! syscall open
mvpnode_1  | npm ERR! path /client/package.json
mvpnode_1  | npm ERR! errno -2
mvpnode_1  | npm ERR! enoent ENOENT: no such file or directory, open '/client/package.json'
mvpnode_1  | npm ERR! enoent This is related to npm not being able to find a file.
mvpnode_1  | npm ERR! enoent

首先,我如何更改我的 yml 文件才能使其正常工作?

其次,我假设容器将保持与 windows 文件系统上的 /server 文件夹的连接是否正确?这样一来,如果我更改应用程序中的代码,它会反映在容器的体积中吗?或者这是错误的,当我启动容器时它会缓存代码的副本?我在网上发现了关于此的相互矛盾的信息。

谢谢!

我认为您的问题是您使用的是 docker 卷。 docker 卷是由 docker 管理的一块存储。在使用热重载进行开发时,您通常需要的是 bind mount,它允许容器访问主机文件系统的一部分。通过热重载,您可以将绑定挂载到保存源代码的位置。

如果您的源代码位于 docker-compose 文件所在目录下的 client 目录中,您可以执行

version: '3.8'
services:
  mpvdb:
    image: mysql:5.7
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=cicd
    ports:
      - 3307:3306
    volumes:
      - db:/var/lib/mysql
      - ./mysql-dump:/docker-entrypoint-initdb.d
  mvpnode:
    image: node:18.1.0
    ports:
      - 4444:4444
    volumes:
      - ./client:/client
    command: sh -c "cd /client && npm install && npm run start"
volumes:
  db:

您还应该在启动时将 npm install 添加到命令 运行 中,因为您需要在启动应用程序之前安装相关的节点模块。