我遇到了在Docker容器中安装node_modules并将它们与主机同步的问题.我的Docker的版本是18.03.1-ce,构建9ee9f40,Docker Compose的版本是1.21.2,构建一个133471.
我的docker-compose.yml看起来像:
# Frontend Container.
frontend:
build: ./app/frontend
volumes:
- ./app/frontend:/usr/src/app
- frontend-node-modules:/usr/src/app/node_modules
ports:
- 3000:3000
environment:
NODE_ENV: ${ENV}
command: npm start
# Define all the external volumes.
volumes:
frontend-node-modules: ~
我的Dockerfile:
# Set the base image.
FROM node:10
# Create and define the working directory.
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
# Install the application's dependencies.
COPY package.json ./
COPY package-lock.json ./
RUN npm install
许多博客文章和Stack Overflow答案都描述了外部卷的技巧.例如,this one.
该应用程序运行良好.源代码是同步的.热重装也很有效.
我唯一的问题是node_modules文件夹在主机上是空的.是否可以将Docker容器内的node_modules文件夹与主机同步?
我已经读过这些答案:
> docker-compose volume on node_modules but is empty
> Accessing node_modules after npm install inside Docker
不幸的是,他们并没有帮助我很多.我不喜欢the first one,因为我不想在我的主机上运行npm install,因为可能存在跨平台问题(例如主机是Windows或Mac,Docker容器是Debian 8或Ubuntu 16.04). The second one对我也不好,因为我想在我的Dockerfile中运行npm install,而不是在Docker容器启动后运行它.
另外,我找到了this blog post.作者试图解决我面临的同样问题.问题是node_modules不会被同步,因为我们只是将它们从Docker容器复制到主机.
我希望Docker容器中的node_modules与主机同步.请考虑我想要:
>自动安装node_modules而不是手动安装
>在Docker容器中安装node_modules而不是主机
>让node_modules与主机同步(如果我在Docker容器中安装了一些新软件包,它应该自动与主机同步,无需任何手动操作)
我需要在主机上安装node_modules,因为:
>在需要时阅读源代码的可能性
> IDE需要在本地安装node_modules,以便它可以访问devDependencies,例如eslint或prettier.我不想全局安装这些devDependencies.
提前致谢.
>当你运行docker build或docker-compose build时,你的Dockerfile会构建一个包含/usr/src / app / node_modules目录和Node安装的新映像,但没有别的.特别是,您的应用程序不在构建的映像中.
>当您使用docker-compose时,卷:[‘./ app / fold:/usr/src / app’]指令会隐藏/usr/src / app中的所有内容,并在其上安装主机系统内容.
>然后卷:[‘frontend-node-modules:/usr/src / app / node_modules’]指令将命名卷挂载到node_modules树之上,隐藏相应的主机系统目录.
如果您要启动另一个容器并将命名卷附加到它,我希望您在那里看到node_modules树.对于您所描述的内容,您只需要不需要命名卷:从dock:block和docker-compose.yml文件末尾的volumes:部分删除第二行.