You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行docker compose up后Next.js访问package.json遇权限拒绝问题

Next.js Docker 容器启动权限报错问题

执行docker compose up启动服务时出现以下错误:

frontend  | ready - started server on 0.0.0.0:3000, url: http://localhost:3000
frontend  | info  - Loaded env from /app/.env.local
frontend  | [Error: EACCES: permission denied, open '/app/.next/package.json'] {
frontend  |   errno: -13,
frontend  |   code: 'EACCES',
frontend  |   syscall: 'open',
frontend  |   path: '/app/.next/package.json'
frontend  | }
frontend exited with code 1

即使将文件设为777权限问题仍存在,已尝试修改文件/文件夹权限、重建容器、调整Dockerfile.dev中的USER和COPY配置,但未解决。相关配置文件如下:

Dockerfile.dev

ARG BASE=node:16.17.1

# install deps
FROM ${BASE} AS project_name_frontend_dev

USER root
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install

COPY --chown=node:node . .

EXPOSE 3000

# for dev purpose
CMD ["npm", "run", "dev"]

docker-compose.yml

services:
  front:
    container_name: frontend
    build:
      context: .
      dockerfile: Dockerfile.prod
      args:
        ARG_NEXT_PUBLIC_FRONT_HOST: ${NEXT_PUBLIC_FRONT_HOST}
        ARG_NEXT_PUBLIC_API_HOST: ${NEXT_PUBLIC_API_HOST}
        ARG_NEXT_PUBLIC_FRONT_BASE: ${NEXT_PUBLIC_FRONT_BASE}
        ARG_NEXT_PUBLIC_API_BASE: ${NEXT_PUBLIC_API_BASE}
        ARG_NEXT_PUBLIC_MEDIA_PATH: ${NEXT_PUBLIC_MEDIA_PATH}
        ARG_NEXT_PUBLIC_IMAGES_DOMAIN: ${NEXT_PUBLIC_IMAGES_DOMAIN}
        ARG_NEXT_PUBLIC_GOOGLE_MAPS_KEY: ${NEXT_PUBLIC_GOOGLE_MAPS_KEY}
        ARG_NEXT_PUBLIC_GOOGLE_CLIENT_ID: ${NEXT_PUBLIC_GOOGLE_CLIENT_ID}
        ARG_NEXT_PUBLIC_FB_APP_ID: ${NEXT_PUBLIC_FB_APP_ID}
        ARG_NEXT_PUBLIC_CHAT_HOST: ${ARG_NEXT_PUBLIC_CHAT_HOST}
        ARG_NEXT_PUBLIC_CHAT_BASE: ${ARG_NEXT_PUBLIC_CHAT_BASE}

    networks:
      - project_net_name
    extra_hosts:
      - "api.project_name.local:ip-address"

networks:
  project_net_name:
    external: true

docker-compose.override.yml

services:
  front:
    container_name: frontend
    build:
      context: .
      dockerfile: Dockerfile.dev
      target: project_name_frontend_dev
    networks:
      - project_net_name
    extra_hosts:
      - "api.project_name.local:ip-address"
    environment:
      NODE_TLS_REJECT_UNAUTHORIZED: 0
    volumes:
      - .:/app
      - /app/node_modules
      - /app/.next

解决方案

1. 切换容器运行用户

问题核心是挂载目录权限与容器内用户不匹配。修改Dockerfile.dev,在启动命令前切换到node用户运行服务:

ARG BASE=node:16.17.1

# install deps
FROM ${BASE} AS project_name_frontend_dev

USER root
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install

COPY --chown=node:node . .

# 新增:切换到node用户
USER node

EXPOSE 3000

CMD ["npm", "run", "dev"]

2. 修复本地.next目录权限

在宿主机上修改.next目录权限,匹配容器内node用户的UID/GID(通常为1000):

sudo chown -R 1000:1000 .next/

3. 调整卷挂载配置(可选)

如果不想修改本地权限,可删除docker-compose.override.yml中/app/.next的匿名卷,让Next.js直接在本地挂载目录生成文件:

volumes:
  - .:/app
  - /app/node_modules
  # 移除这一行:- /app/.next

4. 彻底重建容器

修改配置后,执行以下命令清空旧容器和镜像,重新构建启动:

docker compose down -v
docker compose build --no-cache
docker compose up

内容的提问来源于stack exchange,提问作者Przemysław Ścigała

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:24:52