docker - 如何在 Docker 中设置目录的所有者
问题描述
我正在尝试在 Docker 中创建一个特定用户拥有的目录。我正在使用这个 Dockerfile:
FROM node:14.4.0-alpine
COPY package*.json ./
RUN npm install .
ENV PATH=/node_modules/.bin:$PATH
RUN addgroup -S gofit && adduser -S gofit -G gofit
RUN mkdir /test && chown -R gofit:gofit /test && chmod 777 /test
USER gofit
WORKDIR /test
# if you delete this it's does not work either
VOLUME /test
CMD [ "npm", "test" ]
如果我尝试使用以下命令运行容器:
docker run -v `pwd`:/test -t gofit
我收到以下错误:
➜ gofit git:(master) ✗ docker run -v `pwd`:/test -it gofit
> goFit@1.0.0 test /test
> ava
✖ Internal error
Error: EACCES: permission denied, mkdir '/test/node_modules/.cache/ava'
Error: EACCES: permission denied, mkdir '/test/node_modules/.cache/ava'
at Object.mkdirSync (fs.js:940:3)
at Api._createCacheDir (/node_modules/ava/lib/api.js:274:6)
at Api.run (/node_modules/ava/lib/api.js:117:20)
at Object.exports.run (/node_modules/ava/lib/cli.js:474:31)
at Object.<anonymous> (/node_modules/ava/cli.js:10:23)
at Module._compile (internal/modules/cjs/loader.js:1200:30)
at Object.Module._extensions..js(internal/modules/cjs/loader.js:1220:10)
at Module.load (internal/modules/cjs/loader.js:1049:32)
at Function.Module._load (internal/modules/cjs/loader.js:937:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
─
npm ERR! Test failed. See above for more details.
但那是因为在/test
挂载卷时更改了所有者。如果我跑
docker run -v `pwd`:/test -t gofit ls -la
我得到:
total 188
drwxrwxr-x 7 node node 4096 Oct 26 12:56 .
drwxr-xr-x 1 root root 4096 Oct 26 13:22 ..
drwxrwxr-x 8 node node 4096 Oct 26 12:56 .git
drwxrwxr-x 3 node node 4096 Oct 26 12:56 .github
-rw-rw-r-- 1 node node 1817 Oct 26 12:56 .gitignore
-rw-rw-r-- 1 node node 278 Oct 26 13:17 Dockerfile
-rw-rw-r-- 1 node node 35149 Oct 26 12:56 LICENSE
-rw-rw-r-- 1 node node 2244 Oct 26 12:56 README.md
drwxrwxr-x 3 node node 4096 Oct 26 12:56 docs
-rw-rw-r-- 1 node node 26 Oct 26 12:56 index.js
-rw-rw-r-- 1 node node 258 Oct 26 12:56 iv.yaml
-rw-rw-r-- 1 node node 89131 Oct 26 12:56 package-lock.json
-rw-rw-r-- 1 node node 796 Oct 26 12:56 package.json
drwxrwxr-x 3 node node 4096 Oct 26 12:56 src
drwxrwxr-x 2 node node 4096 Oct 26 12:56 tests
-rw-rw-r-- 1 node node 10030 Oct 26 12:56 words.dic
但是,如果我在不安装卷的情况下运行它,我会得到预期的所有者:
drwxrwxrwx 2 gofit gofit 4096 Oct 26 13:16 .
drwxr-xr-x 1 root root 4096 Oct 26 13:23 ..
有谁知道发生了什么?如何设置权限以让用户gofit
运行测试?或者我应该使用node
用户?
解决方案
推荐阅读
- php - 在模板页面上显示某些帖子格式返回 NULL
- linux - 防止蓝牙驱动程序操作?
- design-patterns - UnitOfWork 模式应该如何实际处理
- ios - 无限导航堆栈
- hive - Hive 视图不反映基表更改
- vb.net - 将应用程序从 SSL 升级到 TLS1.2 需要更改应用程序服务器中的代码以及更改数据库服务器吗?
- vbscript - VBS InputBox,无文件扩展名的输出
- c# - Debug -> 在 Visual Studio 中启动外部程序有什么用
- javascript - 如何使用 jquery 数据表加载本地 JSON 变量
- google-cloud-platform - 如何获取 Cloud Build 的最新更新?