这是一个非常热门的话题,但我从未真正找到解决方案。
您可能知道,当我们在容器中有一个卷并且安装依赖项时(使用npm i
或其他东西)从 Dockerfile(具有默认权限),Npm 将创建一个node_modules
容器中的文件夹root:root
access.
我在使用此方法时遇到两个问题(在本地/开发环境中):
-
The node_modules
文件夹仅存在于容器内部,但主机的 IDE/LSP 需要此文件夹才能正常工作(模块导入、类型定义等)。
-
如果主机想要安装/更新软件包(npm i ...
等)他将不得不重新启动并重建容器node_modules
要更新的文件夹。
所以我想出了另一个想法,如果我使用安装依赖项怎么办CMD
在 Dockerfile 中(或command
服务的属性docker-compose
文件)并使用一个卷,以便node_modules
可以与楼主分享。不幸的是,这种方法引入了新问题。例如,node_modules
has a root:root
权限访问,因此如果您的主机的用户名以其他方式“命名”并且不具有相同的uid
& gid
您将需要运行 root 访问命令更新node_modules
(sudo npm i ...
).
这是我当前的配置:
docker-compose.yml
:
version: '3.7'
services:
app:
container_name: 'app_DEV'
build: .
command: sh -c "yarn install && node ./server.js"
volumes:
- ./:/usr/src/app
ports:
- 3000:3000
tty: true
Dockerfile
:
FROM node:12.8.1-alpine
WORKDIR /usr/src/app
COPY . .
package.json
:
{
"dependencies": {
"express": "^4.17.1"
}
}
server.js
:
const app = require('express')();
app.get('/', (req, res) => {
res.send('Hello');
});
app.listen(3000, () => console.log('App is listening on port 3000'));
然后你可以尝试运行docker-compose up
并做一个ls -la
:
-rw-r--r-- 1 mint mint 215 août 23 16:39 docker-compose.yml
-rw-r--r-- 1 mint mint 56 août 23 16:29 Dockerfile
drwxr-xr-x 52 root root 4096 août 23 16:31 node_modules
-rw-r--r-- 1 mint mint 53 août 23 16:31 package.json
-rw-r--r-- 1 mint mint 160 août 23 16:29 server.js
如您所见,每个文件/文件夹都有mint:mint
访问除了node_modules
(mint
是我的主机的用户)。
总结一下我的问题:有没有更好的方法来管理 Docker 容器的 NodeJS 依赖关系?