Node.js项目Docker容器运行失败,报错/bin/sh: 1: tee /opt/app.log: not found
解决Docker容器运行报错:/bin/sh: 1: tee /opt/app.log: not found
可能原因及对应解决方案
1. 目标目录无写入权限或不存在
官方node:14.16.1镜像默认以node用户运行,/opt目录归root所有,node用户没有写入权限,导致tee无法创建日志文件(shell解析可能将权限问题误显示为"not found")。
解决方法:
- 方案A:将日志文件放在当前工作目录(
/app,已拥有写入权限),修改Dockerfile的CMD:CMD sh ./init.sh 2>&1 | tee app.log - 方案B:提前创建
/opt目录并赋予node用户权限,在Dockerfile中添加:
完整Dockerfile示例:RUN mkdir -p /opt && chown -R node:node /optFROM node:14.16.1 WORKDIR /app COPY . /app RUN chmod 500 /app/init.sh RUN mkdir -p /opt && chown -R node:node /opt CMD sh ./init.sh 2>&1 | tee /opt/app.log
2. 镜像缺少tee命令(针对Alpine变体)
如果实际使用的是node:14.16.1-alpine镜像(轻量Alpine版本),默认未包含tee命令,需安装coreutils包。
解决方法:
在Dockerfile中添加安装命令:
FROM node:14.16.1-alpine WORKDIR /app COPY . /app RUN chmod 500 /app/init.sh RUN apk add --no-cache coreutils CMD sh ./init.sh 2>&1 | tee /opt/app.log
3. 验证tee命令是否存在
可先在镜像中检查tee是否存在:
docker run --rm node:14.16.1 which tee
若输出/usr/bin/tee,说明命令存在,问题大概率出在目录权限/存在性上;若无输出,说明镜像缺少该命令,需按方法2处理。
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

