我node_modules在Docker容器中安装并将其与主机同步时遇到问题。我的Docker版本是,18.03.1-ce, build 9ee9f40而Docker Compose版本是1.21.2, build a133471。
node_modules
18.03.1-ce, build 9ee9f40
1.21.2, build a133471
我的docker-compose.yml样子是:
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:
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
该应用程序运行良好。源代码已同步。热装也很棒。
我唯一的问题node_modules是主机上的文件夹为空。是否可以将node_modulesDocker容器中的文件夹与主机同步?
另外,我已经找到了此博客文章。作者试图解决我面临的同样问题。问题是,node_modules由于我们只是将它们从Docker容器复制到主机,因此不会同步。
我希望我node_modules的Docker容器内部与主机同步。请考虑到我想要的:
我需要node_modules主持人,因为:
devDependencies
eslint
prettier
提前致谢。
首先,我要感谢David Maze和trust512发布他们的答案。不幸的是,他们没有帮助我解决我的问题。
我想发表我对这个问题的答案。
我的docker-compose.yml:
--- # Define Docker Compose version. version: "3" # Define all the containers. services: # Frontend Container. frontend: build: ./app/frontend volumes: - ./app/frontend:/usr/src/app ports: - 3000:3000 environment: NODE_ENV: development command: /usr/src/app/entrypoint.sh
# Set the base image. FROM node:10 # Create and define the node_modules's cache directory. RUN mkdir /usr/src/cache WORKDIR /usr/src/cache # Install the application's dependencies into the node_modules's cache directory. COPY package.json ./ COPY package-lock.json ./ RUN npm install # Create and define the application's working directory. RUN mkdir /usr/src/app WORKDIR /usr/src/app
最后但并非最不重要的entrypoint.sh:
entrypoint.sh
#!/bin/bash cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/ exec npm start
这里最棘手的部分是将安装程序安装node_modules到我们的中定义node_module的缓存目录(/usr/src/cache)中Dockerfile。之后,entrypoint.sh将将其node_modules从缓存目录(/usr/src/cache)移至我们的应用程序目录(/usr/src/app)。由于这个原因,整个node_modules目录将出现在我们的主机上。
node_module
/usr/src/cache
/usr/src/app
看着上面的问题,我想要:
node_modules自动安装而不是手动安装 安装node_modules在Docker容器而不是主机中 已经node_modules与主机(同步,如果我安装多克尔容器内的一些新的包装,应自动与主机无需任何手动操作同步
第一件事完成了:node_modules自动安装。第二件事也完成了:node_modules安装在Docker容器中(因此,不会出现跨平台问题)。第三件事也完成了:node_modules安装在Docker容器中的主机将在我们的主机上 可见 并且将被 同步 !如果我们在Docker容器中安装了一些新软件包,它将立即与我们的主机同步。
需要注意的重要一点:确实,安装在Docker容器中的新软件包将出现在中/usr/src/app/node_modules。由于此目录与我们的主机同步,因此这个新软件包也将出现在我们主机的node_modules目录中。但是,此时/usr/src/cache/node_modules将具有旧版本(没有此新软件包)。无论如何,这对我们来说不是问题。在下一个docker- compose up --build(--build必需)期间,Docker将重新安装node_modules(因为package.json已更改),并且entrypoint.sh文件会将它们移至我们的/usr/src/app/node_modules。
/usr/src/app/node_modules
/usr/src/cache/node_modules
docker- compose up --build
--build
package.json
您应该考虑另一件事。如果您git pull从远程存储库中获取代码,或者git checkout your-teammate- branch在运行Docker时,可能会将一些新软件包添加到package.json文件中。在这种情况下,您应该使用停止Docker,CTRL + C然后使用docker-compose up --build(--build必需)再次将其重新启动。如果您的容器作为守护程序运行,则应执行docker-compose stop以停止容器并使用docker-compose up --build(--build必需)再次将其重新启动。
git pull
git checkout your-teammate- branch
CTRL + C
docker-compose up --build
docker-compose stop
如有任何疑问,请在评论中让我知道。
希望这可以帮助。