我的服务(docker-compose.yml
):
nodejs:
build:
context: configs/nodejs
args:
- UID=$UID
- GID=$GID
container_name: nodejs_container
volumes:
- ${APP_HOST}:${APP_CONTAINER_PATH}
working_dir: ${APP_CONTAINER_FRONTEND_PATH}
command: sh -c "ls -la && npm install && npm run build"
我Dockerfile:
FROM node:lts-alpine
ARG UID
ARG GID
RUN npm install -g @vue/cli
USER $UID:$GID
但是文件的权限设置不正确
nodejs_container | total 728
nodejs_container | drwxrwxr-x 4 1001 xfs 4096 Jan 26 07:09 .
nodejs_container | drwxrwxr-x 15 1001 xfs 4096 Jan 26 06:06 ..
nodejs_container | -rw-rw-r-- 1 1001 xfs 43 Jan 24 16:47 .browserslistrc
nodejs_container | -rw-rw-r-- 1 1001 xfs 121 Jan 24 16:47 .editorconfig
nodejs_container | -rw-rw-r-- 1 1001 xfs 3302 Jan 24 16:47 .eslintrc.js
nodejs_container | -rw-rw-r-- 1 1001 xfs 283 Jan 24 16:47 .gitignore
nodejs_container | -rw-rw-r-- 1 1001 xfs 427 Jan 24 16:47 README.md
nodejs_container | -rw-rw-r-- 1 1001 xfs 76 Jan 24 16:47 babel.config.js
nodejs_container | -rw-rw-r-- 1 1001 xfs 50 Jan 24 16:47 cypress.json
nodejs_container | -rw-rw-r-- 1 1001 xfs 834 Jan 24 16:47 jest.config.js
nodejs_container | -rw-rw-r-- 1 1001 xfs 680479 Jan 26 06:54 package-lock.json
nodejs_container | -rw-rw-r-- 1 1001 xfs 2048 Jan 25 09:26 package.json
...
在启动docker之前,我设置了环境变量:export UID=$(id -u)
和export GID=$(id -g)
为什么不为运行docker compose的环境变量中的目录和文件设置$UID:$GID
值?
尝试环境args
作为一个例子,
https://docs.docker.com/compose/environment-variables/
当您将volumes:
挂载到本机linux主机上的容器上时,在容器中使用主机系统的数字文件所有者和权限。如果主机用户ID 1001拥有这些文件,那么在容器内它们也将由ID 1001拥有。容器的用户ID在这里不起作用。
原则上,您可以使用入口点包装器脚本来更改文件的所有者,但这也会更改它们在主机上的所有者。更好的做法是将您当前拥有的所有设置移到Dockerfile:COPY
(应用程序代码)中,RUN npm ci && npm build
,然后设置容器的CMD
来启动应用程序。这个隔离容器运行的特定用户ID无关紧要,不过最好不要使用root用户。
考虑到您所展示的Dockerfile和Compose设置,仅使用主机节点进程可能更有效。它自然会使用主机的文件系统和主机用户ID运行。如果您只是试图将此设置用作本地文件的构建系统,则更是如此。