【发布时间】:2019-08-23 15:05:09
【问题描述】:
这是一个很好讨论的话题,但我从未找到解决方案。
所以您可能知道,当我的容器中有一个卷并且我在 Dockerfile 中使用yarn install 安装我的依赖项时,Yarn 将在我的容器上创建一个node_modules 文件夹,并具有root:root 访问权限。
这种方法有两个问题(在本地/开发环境中):
node_modules文件夹仅在我的容器中,但主机的代码编辑器(我的是 VSC)可能需要此文件夹才能正常工作。比如你没有,VSC会骂你找不到导入的模块...如果主机想要使用
yarn add ...安装软件包,他将不得不重新启动并重建容器以安装要安装的软件包。
所以我想出了另一个想法,如果我在 Dockerfile 中使用 CMD 安装依赖项(或者在 docker-compose 文件中使用服务的 command 属性)会怎样。因此,Docker 将与主机共享node_modules。但这是主要问题,node_modules 具有 root:root 权限访问,因此如果您的主机的用户名命名为例如 mint 并且没有相同的 uid 和 gid 您将需要运行 root访问命令以安装/删除依赖项(例如 sudo yarn add ...)。
这是我当前的配置:
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 是我主机的用户)。这就是第二种解决方案的问题。
最后,我的问题是:有没有更好的方法来完成这一切?
【问题讨论】:
-
您可以在 dockerfile 中使用
USER指令,以便不以 root 身份运行所有内容,而是以特定用户身份运行。其中,安全方面是一个更好的主意,而不是以 root 身份运行所有内容。 -
@β.εηοιτ.βε 使用硬编码的 uid / gid ?如果是,图像可以重复使用吗?他们是否需要与我的主机相同才能修改
node_modules文件夹?
标签: javascript node.js docker docker-compose docker-machine