Docker镜像安装Node.js 14后npm缺失的问题求助
Docker构建报错:npm命令找不到,Node.js 14安装后缺失npm
问题背景
我用以下Dockerfile构建同时包含Python 3.8和Node.js 14的镜像:
FROM python:3.8-slim ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 ENV DJANGO_DEVELOPMENT 1 #Installing neccessary packages RUN apt-get update && apt-get install -y git curl virtualenv default-mysql-server default-mysql-client RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - RUN apt-get install nodejs -y RUN npm install -g @vue/cli #Installing Python dependencies RUN pip install --upgrade pip && pip install nodeenv
按照预期,通过curl -sL https://deb.nodesource.com/setup_14.x | bash -和apt-get install nodejs -y应该同时安装Node.js和npm,但执行docker build .时出现报错,提示找不到npm:
=> [internal] load build definition from dev.Dockerfile 0.1s => => transferring dockerfile: 482B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/python:3.8-slim 0.4s => [1/6] FROM docker.io/library/python:3.8-slim@sha256:10e07e36f86af4371accc42642852aa60eab74e6896fc065345ebc2c576eec0d 0.0s => CACHED [2/6] RUN apt-get update && apt-get install -y git curl virtualenv default-mysql-server default-mysql-client 0.0s => CACHED [3/6] RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - 0.0s => CACHED [4/6] RUN apt-get install nodejs -y 0.0s => ERROR [5/6] RUN npm install -g @vue/cli 0.3s ------ > [5/6] RUN npm install -g @vue/cli: #0 0.267 /bin/sh: 1: npm: not found ------ dev.Dockerfile:11 -------------------- 9 | RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - 10 | RUN apt-get install nodejs -y 11 | >>> RUN npm install -g @vue/cli 12 | 13 | #Installing Python dependencies -------------------- ERROR: failed to solve: process "/bin/sh -c npm install -g @vue/cli" did not complete successfully: exit code: 127
我的package.json内容如下:
{ "name": "name", "version": "0.1.0", "private": true, "resolutions": { "glob-parent": "^5.1.2", "node-forge": "1.3.0", "ansi-regex": "5.0.1", "ejs": "3.1.7" }, "scripts": { "preinstall": "npx npm-force-resolutions", "serve": "vue-cli-service serve", "build": "vue-cli-service build", "test:unit": "vue-cli-service test:unit --setupTestFrameworkScriptFile=./tests/setup.js", "lint": "vue-cli-service lint" }, "dependencies": { "axios": "^0.24.0", "core-js": "^3.22.7", "js-cookie": "^3.0.1", "vue": "^2.6.11", "vue-pdf-app": "^2.1.0", "vue-router": "^3.5.4", "vue-spinner": "^1.0.4", "vuetify": "^2.6.6" }, "devDependencies": { "@vue/cli-plugin-babel": "~4.5.0", "@vue/cli-plugin-eslint": "~4.5.0", "@vue/cli-plugin-router": "~4.5.0", "@vue/cli-plugin-unit-jest": "~4.5.0", "@vue/cli-service": "~4.5.0", "@vue/eslint-config-airbnb": "^5.0.2", "@vue/test-utils": "^1.0.3", "babel-eslint": "^10.1.0", "eslint": "^6.7.2", "eslint-plugin-import": "^2.26.0", "eslint-plugin-vue": "^6.2.2", "sass": "~1.32.0", "sass-loader": "^10.2.1", "vue-cli-plugin-vuetify": "^2.4.8", "vue-template-compiler": "^2.6.11", "vuetify-loader": "^1.7.0" }, "eslintConfig": { "rules": { "no-console": "off" } } }
尝试过添加RUN apt-get install npm,但会安装不兼容的npm版本,导致后续代码报错。
解决方案
1. 清理Docker缓存后重新构建
当前构建过程中[3/6]和[4/6]步骤显示CACHED,说明Docker复用了之前的缓存层,可能之前的安装未正确完成npm部署。执行以下命令清理缓存后重新构建:
docker builder prune docker build .
2. 修改Dockerfile,合并安装命令
将Node.js相关安装步骤合并到一个RUN指令中,避免缓存导致的流程断裂,同时添加镜像优化操作:
FROM python:3.8-slim ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 ENV DJANGO_DEVELOPMENT 1 # 安装依赖包及Node.js 14 RUN apt-get update && apt-get install -y --no-install-recommends \ git curl virtualenv default-mysql-server default-mysql-client \ && curl -sL https://deb.nodesource.com/setup_14.x | bash - \ && apt-get install -y nodejs \ && npm install -g @vue/cli \ # 清理apt缓存以减小镜像体积 && apt-get clean \ && rm -rf /var/lib/apt/lists/* # 安装Python依赖 RUN pip install --upgrade pip && pip install nodeenv
3. 验证安装完整性(可选)
可以在Dockerfile中添加验证步骤,确保Node.js和npm安装成功:
RUN node --version && npm --version
说明
- 合并
RUN指令能避免Docker缓存中间层导致的安装不完整问题,确保Node.js与npm的安装流程连贯执行。 - nodesource的setup脚本会配置对应版本的软件源,安装的
nodejs包已包含兼容的npm,无需单独安装系统默认的npm包。 - 清理apt缓存是Docker镜像优化的常规操作,可有效减小镜像体积。
内容的提问来源于stack exchange,提问作者hjbello
相关产品推荐
相关产品推荐

