Docker构建返回非零代码127:RUN命令未找到问题求助
解决Docker构建时
/bin/sh: RUN: not found的错误 这个问题是对Dockerfile的RUN指令语法理解出了小偏差,我来给你理清楚:
你修改后的Dockerfile里犯了一个典型错误——把多个RUN关键字写在了同一条指令里:
FROM alpine:3.4 RUN apk update && RUN apk add curl && RUN apk add vim && RUN apk add git
这里的核心问题是:RUN是Dockerfile的指令关键字,每一个RUN开头代表一条独立的构建步骤。当你把RUN放在&&后面时,Docker会把整段字符串apk update && RUN apk add ...传给shell执行,shell会把RUN当成一个系统命令去查找——但Alpine镜像里根本没有这个命令,所以就抛出了RUN: not found的错误,返回码127就是系统找不到指定命令的标准错误码。
正确的写法有两种:
1. 合并成一条RUN指令(推荐,减少镜像层)
把所有要执行的shell命令用&&连接,只保留一个RUN关键字,而且可以把多个apk add合并成一个命令,更符合Alpine的使用习惯:
FROM alpine:3.4 RUN apk update && apk add curl vim git
2. 拆分成多条独立的RUN指令
如果需要把步骤分开,每条指令单独用RUN开头:
FROM alpine:3.4 RUN apk update RUN apk add curl RUN apk add vim RUN apk add git
额外优化小提示
第一种写法更推荐,因为Docker每执行一条RUN就会生成一个新的镜像层,过多的镜像层会增大镜像体积,也会降低构建效率。合并成一条RUN可以减少层数,同时用&&连接可以保证前面的命令执行成功后才会执行后面的,避免构建失败时出现无效的镜像层。
内容的提问来源于stack exchange,提问作者Amit M
相关产品推荐
相关产品推荐

