在Docker容器和主机之间同步node_modules文件夹

3
我希望将我的React应用程序docker化,并在此过程中有一个问题。我想在容器中安装node_modules,然后将它们同步到主机,以便我可以在容器而不是主机上运行npm命令。我已经实现了这一点,但是同步到我的计算机的node_modules文件夹是空的,但在容器中是填充的。这是一个问题,因为我在IDE中收到未安装警告,因为主机机器上的node_modules文件夹是空的。
docker-compose.yml:
version: '3.9'

services:
  frontend:
    build:
      dockerfile: Dockerfile
      context: ./frontend
    volumes:
      - /usr/src/app/node_modules
      - ./frontend:/usr/src/app

Dockerfile:

FROM node:18-alpine3.15
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install && \
    mkdir -p node_modules/.cache && \
    chmod -R 777 node_modules/.cache
COPY ./ ./ 
CMD npm run start

我希望能得到任何关于IT技术的提示和/或帮助。


你认为为什么需要同步node_modules文件夹? - Danil Apsadikov
否则,当我编写关于缺少模块的新代码时,IDE会不断出现错误。在使用Docker容器进行开发时,我应该采取不同的路线吗? - Ditto
请在主机上尝试运行npm install。 - Danil Apsadikov
主机和Docker是两个完全不相关的机器,如果你不想运行很多命令,可以编写一个Bash脚本。 - Danil Apsadikov
@Ditto,你最终找到解决办法了吗?比如评论中提到的bash脚本。 - undefined
显示剩余3条评论
1个回答

0

你不能像这样真正地“共享”node_modules,因为在安装过程中会发生某些特定于操作系统的步骤。一些模块需要针对主机机器进行编译步骤。其他模块具有符号链接的bin声明,而符号链接无法在主机和容器之间“挂载”或共享。即使是不同版本的node也不能共享node_modules而不重新构建。

如果你想在docker中开发,有两个选择:

  1. 使用VSCode(可能其他编辑器也可以)在容器内部编辑。我以前试过这个方法,但并不是很有趣,而且有点繁琐——它并不能完全按照你的意愿工作。
  2. 在主机机器上编辑文件,这些文件被挂载到docker中。Nodemon/webpack等将看到更改并相应地重建。

我推荐第二种方法——我在许多公司看到过这种方法,它是一种非常“标准”的开发方式。这确实需要在主机机器上进行npm安装——不要试图避免额外的npm安装而陷入困境。

如果你想让安装和构建更快,最好的方法是将你的npm缓存目录挂载到docker容器中。你需要在主机和docker容器上运行npm get cache来找到npm缓存位置。你可以通过以下方式在docker容器上完成这个操作:
docker run --rm -it <your_image> npm get cache

您可以像挂载其他卷一样挂载缓存文件夹。您可以在 Docker 和主机上分别运行单独的安装 - 文件只会下载一次,并且所有编译和符号链接都将正确进行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接