如何在Docker中设置目录所有者

如何在Docker中设置目录所有者,docker,permissions,docker-volume,chown,Docker,Permissions,Docker Volume,Chown,我试图在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

我试图在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.
我得到:

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 ..

有人知道发生了什么吗?如何设置允许用户运行测试的权限?或者我应该使用
node
user吗?

从容器中使用
id gofit
查看gofit用户的id。可能您可以将卷映射文件的权限授予主机中具有相同id的用户。您也可以尝试使用
usermod
编辑gofit用户,并为其提供节点用户id,但我不确定这是否可行。Alpine不允许您创建具有相同UUID的用户。
drwxrwxrwx    2 gofit    gofit         4096 Oct 26 13:16 .
drwxr-xr-x    1 root     root          4096 Oct 26 13:23 ..