Docker运行Node.js镜像时出现/bin/sh:1:{node,: not found错误求助
排查Docker运行Node.js应用时的
/bin/sh: 1: {node,: not found错误 问题1:CMD命令格式解析异常
你遇到的/bin/sh: 1: {node,: not found报错,核心原因是Dockerfile中CMD指令的格式被错误识别成了shell命令而非JSON数组。当Docker以shell模式执行CMD时,错误的语法结构(比如误写大括号{}或引号格式错误)会触发该提示。
修正方案
确保Dockerfile中的CMD使用标准JSON数组格式(英文引号、中括号):
FROM node:14 WORKDIR /app COPY package.json . RUN npm install COPY . . EXPOSE 3000 CMD ["node", "app.mjs"]
修改后重新构建镜像:
docker build -t your-image-name .
问题2:顶层await的兼容性问题
你的app.mjs中使用了顶层await,但Node.js 14.0~14.7版本里顶层await属于实验特性,需手动开启;即使是14.8+版本,直接使用也存在兼容性风险。
修正方案
将顶层await封装到async函数中,避免依赖实验特性:
import express from 'express'; import connectToDatabase from './helpers.mjs'; const app = express(); app.get('/', (req, res) => { res.send('<h2>Hi there!</h2>'); }); // 将启动逻辑封装到async函数 async function startServer() { await connectToDatabase(); app.listen(3000, () => { console.log('Server running on port 3000'); }); } startServer();
如果坚持使用顶层await,需修改Dockerfile的CMD添加实验性参数:
CMD ["node", "--experimental-top-level-await", "app.mjs"]
额外检查项
- 确认
package.json中已声明express依赖:{ "dependencies": { "express": "^4.18.2" } } - 运行容器时映射正确端口:
docker run -p 3000:3000 your-image-name
内容的提问来源于stack exchange,提问作者Saucter
相关产品推荐
相关产品推荐

