Ubuntu下Docker Desktop绑定卷权限问题求助(EACCES错误)
Ubuntu下Docker Desktop绑定卷权限冲突导致EACCES错误
场景
在Ubuntu系统使用Docker Desktop进行本地开发,通过Docker Compose运行Nest.js+Python混合项目,将宿主当前目录挂载为容器内的卷,希望修改宿主代码后同步到容器并调试运行。
核心问题
Linux环境下Docker Desktop绑定卷时会重映射用户和组ID:容器内root用户(UID0)被映射为宿主用户(宿主UID为1000),但API容器使用UID为1000的非root用户pn运行,导致挂载卷同步的文件所有者为root(UID0),容器内运行用户pn无权限写入,出现EACCES: permission denied错误。
配置文件
docker-compose.yml
version: '3.8' services: api: build: context: . dockerfile: Dockerfile args: - APP_PORT=${APP_PORT:-3000} # Only build development stage from Dockerfile target: development container_name: api-app volumes: - .:/usr/src/app - /usr/src/app/node_modules networks: - appnetwork depends_on: - postgres env_file: - .env # Run in debug mode: npm run start:debug # Run in dev mode: npm run start:dev command: npm run start:debug ports: - ${APP_PORT}:${APP_PORT} - 9229:9229 restart: unless-stopped postgres: image: postgres:15.2 container_name: postgres-app environment: POSTGRES_USER: ${DB_USERNAME} POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_DB: ${DB_NAME} TZ: ${TZ} networks: - appnetwork volumes: - db-data:/var/lib/postgresql/data ports: - 5432:5432 networks: appnetwork: name: shared-app-network driver: bridge volumes: db-data: driver: local
Dockerfile
ARG IMAGE=nikolaik/python-nodejs:python3.11-nodejs18-slim FROM $IMAGE AS base RUN mkdir -p /usr/src/app RUN chown -R pn:pn /usr/src/app && chmod -R 700 /usr/src/app ENV TZ="America/New_York" WORKDIR /usr/src/app FROM base AS development USER pn COPY --chown=pn:pn package*.json ./ COPY --chown=pn:pn python/* python/ RUN npm install RUN pip install -r python/requirements.txt COPY --chown=pn:pn . . RUN npm run build CMD [ "node", "dist/main" ] ## PRODUCTION FROM base AS production ARG APP_PORT=$APP_PORT ARG NODE_ENV=production ENV NODE_ENV=$NODE_ENV USER pn COPY --chown=pn:pn package*.json ./ COPY --chown=pn:pn python/* python/ RUN npm install RUN pip install -r python/requirements.txt COPY --from=development /usr/src/app/dist dist/ EXPOSE ${APP_PORT} CMD [ "node", "dist/main" ]
容器内错误信息
api-app | api-app | error TS5033: Could not write file '/usr/src/app/dist/utils/utils.js.map': EACCES: permission denied, mkdir '/usr/src/app/dist'. api-app | api-app | error TS5033: Could not write file '/usr/src/app/dist/utils/xl-parser.d.ts': EACCES: permission denied, mkdir '/usr/src/app/dist'. api-app | api-app | error TS5033: Could not write file '/usr/src/app/dist/utils/xl-parser.js': EACCES: permission denied, mkdir '/usr/src/app/dist'. api-app | api-app | error TS5033: Could not write file '/usr/src/app/dist/utils/xl-parser.js.map': EACCES: permission denied, mkdir '/usr/src/app/dist'.
容器内文件权限信息
ls -la 输出
$ ls -la total 832 drwxrwxr-x 8 root root 4096 May 10 13:42 . drwxr-xr-x 1 root root 4096 May 9 20:22 .. -rw-rw-r-- 1 root root 92 May 9 20:27 .dockerignore -rw-rw-r-- 1 root root 299 May 9 23:16 .env -rw-rw-r-- 1 root root 199 May 9 20:27 .env.sample -rw-rw-r-- 1 root root 788 May 9 20:27 .eslintrc.js drwxrwxr-x 8 root root 4096 May 10 13:33 .git -rw-rw-r-- 1 root root 522 May 9 20:27 .gitignore -rw-rw-r-- 1 root root 60 May 9 20:27 .prettierrc drwxrwxr-x 2 root root 4096 May 9 20:27 .vscode -rw-rw-r-- 1 root root 864 May 10 20:53 Dockerfile -rw-rw-r-- 1 root root 2017 May 10 00:00 Dockerfile.dev -rw-rw-r-- 1 root root 1063 May 9 20:27 LICENSE -rw-rw-r-- 1 root root 839 May 9 20:27 README.md -rw-rw-r-- 1 root root 1107 May 10 00:02 docker-compose.yml -rw-rw-r-- 1 root root 483 May 10 13:42 dockercntct.txt -rw-rw-r-- 1 root root 2412 May 10 13:41 dockerinfo.txt -rw-rw-r-- 1 root root 179 May 9 20:27 nest-cli.json drwxr-xr-x 591 pn pn 20480 May 10 20:54 node_modules -rw-rw-r-- 1 root root 725053 May 9 20:27 package-lock.json -rw-rw-r-- 1 root root 3418 May 9 20:27 package.json drwxrwxr-x 2 root root 4096 May 9 20:27 python drwxrwxr-x 22 root root 4096 May 9 20:27 src drwxrwxr-x 2 root root 4096 May 9 20:27 test -rw-rw-r-- 1 root root 101 May 9 20:27 tsconfig.build.json -rw-rw-r-- 1 root root 629 May 9 20:27 tsconfig.json
ls -lan 输出
$ ls -lan total 832 drwxrwxr-x 8 0 0 4096 May 10 13:42 . drwxr-xr-x 1 0 0 4096 May 9 20:22 .. -rw-rw-r-- 1 0 0 92 May 9 20:27 .dockerignore -rw-rw-r-- 1 0 0 299 May 9 23:16 .env -rw-rw-r-- 1 0 0 199 May 9 20:27 .env.sample -rw-rw-r-- 1 0 0 788 May 9 20:27 .eslintrc.js drwxrwxr-x 8 0 0 4096 May 10 13:33 .git -rw-rw-r-- 1 0 0 522 May 9 20:27 .gitignore -rw-rw-r-- 1 0 0 60 May 9 20:27 .prettierrc drwxrwxr-x 2 0 0 4096 May 9 20:27 .vscode -rw-rw-r-- 1 0 0 864 May 10 20:53 Dockerfile -rw-rw-r-- 1 0 0 2017 May 10 00:00 Dockerfile.dev -rw-rw-r-- 1 0 0 1063 May 9 20:27 LICENSE -rw-rw-r-- 1 0 0 839 May 9 20:27 README.md -rw-rw-r-- 1 0 0 1107 May 10 00:02 docker-compose.yml -rw-rw-r-- 1 0 0 483 May 10 13:42 dockercntct.txt -rw-rw-r-- 1 0 0 2412 May 10 13:41 dockerinfo.txt -rw-rw-r-- 1 0 0 179 May 9 20:27 nest-cli.json drwxr-xr-x 591 1000 1000 20480 May 10 20:54 node_modules -rw-rw-r-- 1 0 0 725053 May 9 20:27 package-lock.json -rw-rw-r-- 1 0 0 3418 May 9 20:27 package.json drwxrwxr-x 2 0 0 4096 May 9 20:27 python drwxrwxr-x 22 0 0 4096 May 9 20:27 src drwxrwxr-x 2 0 0 4096 May 9 20:27 test -rw-rw-r-- 1 0 0 101 May 9 20:27 tsconfig.build.json -rw-rw-r-- 1 0 0 629 May 9 20:27 tsconfig.json
已尝试的无效方案
- 将容器内用户ID设为宿主的1000
- 参考相关博客调整配置
- 基于Python镜像重新构建容器
求助需求
求可行的解决办法,让容器内pn用户能正常写入挂载卷,实现代码同步调试。
内容的提问来源于stack exchange,提问作者Santhosh Sasidharan
相关产品推荐
相关产品推荐

