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

Docker运行Vue应用遇vue-cli-service权限拒绝问题求助

Vue应用Docker运行权限拒绝问题

成功构建Vue应用Docker镜像,但启动容器时出现内部权限拒绝错误,无法执行vue-cli-service命令。

我的Dockerfile

FROM node:latest AS build

RUN mkdir /app
WORKDIR /app

COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
RUN npm install

COPY . .

USER node

EXPOSE 8686

CMD ["npm", "run", "serve"]

运行命令及错误

执行启动命令:

sudo docker run -p 8888:8686 my-vue-app

得到错误:

[sudo] password for user: 

> educodingspace@0.1.0 serve
> vue-cli-service serve --port 8686

sh: 1: vue-cli-service: Permission denied

Docker构建信息

构建命令:

sudo docker build -t my-vue-app .

构建输出:

[+] Building 34.1s (11/11) FINISHED                                                                                                         
 => [internal] load build definition from Dockerfile                                                                                  0.0s
 => => transferring dockerfile: 410B                                                                                                  0.0s
 => [internal] load metadata for docker.io/library/node:latest                                                                        2.5s
 => [internal] load .dockerignore                                                                                                     0.0s
 => => transferring context: 2B                                                                                                       0.0s
 => [1/6] FROM docker.io/library/node:latest@sha256:64c46a664eccedec63941dab4027c178a36debe08a232d4f9d7da5aca91cff3d                 13.6s
 => => resolve docker.io/library/node:latest@sha256:64c46a664eccedec63941dab4027c178a36debe08a232d4f9d7da5aca91cff3d                  0.0s
 => => sha256:64c46a664eccedec63941dab4027c178a36debe08a232d4f9d7da5aca91cff3d 1.21kB / 1.21kB                                        0.0s
 => => sha256:aa70582e85cf5d05c7505bed0cfbf6846e369253f88f8eeeb0f9f57d86a40274 2.00kB / 2.00kB                                        0.0s
 => => sha256:5199d6829c9501975002f30375c1b1ff47c5a71b8bfa07d9696c33fa6fb42c7b 7.41kB / 7.41kB                                        0.0s
 => => sha256:1468e7ff95fcb865fbc4dee7094f8b99c4dcddd6eb2180cf044c7396baf6fc2f 49.58MB / 49.58MB                                      1.4s
 => => sha256:2cf9c2b42f41b1845f3e4421b723d56146db82939dc884555e077768e18132f4 24.05MB / 24.05MB                                      1.3s
 => => sha256:c4c40c3e3cdf945721f480e1d939aac857876fdb5c33b8fbfcf655c63b0b9428 64.14MB / 64.14MB                                      2.3s
 => => extracting sha256:1468e7ff95fcb865fbc4dee7094f8b99c4dcddd6eb2180cf044c7396baf6fc2f                                             1.6s
 => => sha256:c05cc1123d7e335d59b0f465c23b7ad2ad27f4875b6c3eab41c65a9b50efa382 211.18MB / 211.18MB                                    5.6s
 => => sha256:04f2356c02d21ef160986f7994210be28dab889b9ba0724e126bd2ee4ed21cd6 3.37kB / 3.37kB                                        1.7s
 => => sha256:6ddb20e283af7117b546019c38904abe23562b4c509835e197e90ece86329c8f 52.03MB / 52.03MB                                      3.6s
 => => sha256:1e529f01353c8cc4b282dcf88ea4afda96f67b51b4d50e1d66334db747e4dacb 1.25MB / 1.25MB                                        2.6s
 => => sha256:76462c7b107c254da6e449995ef8040b3445701fc0cbad6d027bb2324b2898fc 451B / 451B                                            2.9s
 => => extracting sha256:2cf9c2b42f41b1845f3e4421b723d56146db82939dc884555e077768e18132f4                                             0.5s
 => => extracting sha256:c4c40c3e3cdf945721f480e1d939aac857876fdb5c33b8fbfcf655c63b0b9428                                             2.0s
 => => extracting sha256:c05cc1123d7e335d59b0f465c23b7ad2ad27f4875b6c3eab41c65a9b50efa382                                             5.6s
 => => extracting sha256:04f2356c02d21ef160986f7994210be28dab889b9ba0724e126bd2ee4ed21cd6                                             0.0s
 => => extracting sha256:6ddb20e283af7117b546019c38904abe23562b4c509835e197e90ece86329c8f                                             1.7s
 => => extracting sha256:1e529f01353c8cc4b282dcf88ea4afda96f67b51b4d50e1d66334db747e4dacb                                             0.0s
 => => extracting sha256:76462c7b107c254da6e449995ef8040b3445701fc0cbad6d027bb2324b2898fc                                             0.0s
 => [internal] load build context                                                                                                     2.2s                                                                                         2.1s
 => [2/6] RUN mkdir /app                                                                                                              1.7s
 => [3/6] WORKDIR /app                                                                                                                0.0s
 => [4/6] COPY [package.json, package-lock.json*, npm-shrinkwrap.json*, ./]                                                           0.3s
 => [5/6] RUN npm install                                                                                                             9.6s
 => [6/6] COPY . .                                                                                                                    3.7s
 => exporting to image                                                                                                                2.4s
 => => exporting layers                                                                                                               2.4s
 => => writing image sha256:330b1738c423c9e9d53c7465e4ad4b2c581f8682f32e29fd9ef7369745254d4d                                          0.0s
 => => naming to docker.io/library/my-vue-app:latest      

解决方案

原因分析

切换到node用户后,该用户没有vue-cli-service的执行权限——npm install以root用户执行,生成的node_modules目录及其中的二进制文件权限属于root,普通node用户无法执行。

修复方案

方案1:调整权限后切换用户(推荐)

在Dockerfile中,执行完npm install和COPY . .后,修改/app目录的权限为node用户所有,再切换用户:

FROM node:latest AS build

RUN mkdir /app
WORKDIR /app

COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
RUN npm install

COPY . .

# 修改/app目录权限为node用户
RUN chown -R node:node /app

USER node

EXPOSE 8686

CMD ["npm", "run", "serve"]

方案2:使用root用户运行(仅开发环境测试用)

去掉USER node指令,直接用root用户运行容器:

FROM node:latest AS build

RUN mkdir /app
WORKDIR /app

COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
RUN npm install

COPY . .

EXPOSE 8686

CMD ["npm", "run", "serve"]

方案3:全局安装vue-cli-service(可选)

如果项目依赖全局的vue-cli,可在npm install时加上全局安装,确保node用户能访问到:

FROM node:latest AS build

RUN mkdir /app
WORKDIR /app

COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
RUN npm install && npm install -g @vue/cli-service

COPY . .

USER node

EXPOSE 8686

CMD ["npm", "run", "serve"]

验证方法

修改Dockerfile后,重新构建镜像并运行:

sudo docker build -t my-vue-app .
sudo docker run -p 8888:8686 my-vue-app

内容的提问来源于stack exchange,提问作者lcyll

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:57:33