我正在尝试通过Docker Compose在Docker容器中运行Node.js。
node_modules
应该在映像中创建,并且源代码应该从主机同步。
因此,我在docker-compose.yml中使用了两个卷。一个用于我的项目源,另一个用于图像中的node_modules
。
一切似乎都正常。 node_modules
已安装,nodemon
启动了该应用程序。在我的Docker容器中,我有一个带有所有依赖项的node_modules
文件夹。在我的主机上创建了一个空的node_modules
(我不确定是否可以这样做)。
但是,当我从项目中更改文件时。 nodemon
进程检测到文件更改并重新启动应用程序。现在,由于找不到模块,应用程序崩溃了。 Docker容器中的node_modules
文件夹现在为空。
我在做什么错?
我的文件夹结构如下
/
├── docker-compose.yml
├── project/
│ ├── package.json
│ ├── Dockerfile
docker-compose.yml
version: '3'
services:
app:
build: ./project
volumes:
- ./project/:/app/
- /app/node_modules/
项目/ Dockerfile
# base image
FROM node:9
ENV APP_ROOT /app
# set working directory
RUN mkdir $APP_ROOT
WORKDIR $APP_ROOT
# install and cache app dependencies
COPY package.json $APP_ROOT
COPY package-lock.json $APP_ROOT
RUN npm install
# add app
COPY . $APP_ROOT
# start app
CMD ["npm", "run", "start"]
project / package.json
...
"scripts": {
"start": "nodemon index.js"
}
...
答案 0 :(得分:0)
映射卷可以使文件可用于容器,而不是相反。
您可以通过在CMD中运行“ npm install”来解决问题。您可以通过运行npm install && npm run start的“启动”脚本(例如,start.sh)来实现。该脚本应使用普通的COPY命令复制到容器中并且可以执行。
启动容器时,您应该在node_modules文件夹(主机上)中看到文件。
答案 1 :(得分:0)
您可以使用以下两种解决方案中的任何一种:
npm install
在主机上,并创建一个容器可以使用并引用主机node_modules
文件夹的卷。npm install
-这对于开发设置可能是一件痛苦的事情,因为每次您重新启动容器时(如果您更改了一些文件),npm i
都会使用。