Docker运行prometheus-vmware-exporter报$PATH无对应可执行文件错误
问题原因
报错提示executable file not found in $PATH,直接原因是容器启动时找不到ENTRYPOINT指定的prometheus-vmware-exporter可执行文件,对应你给出的Dockerfile,有3个常见触发点:
- builder阶段执行
go build时没有显式指定输出二进制名,部分Go版本/模块配置下,默认生成的二进制文件名和预期不符,导致后续COPY步骤实际没有把二进制拷到最终镜像里 - COPY到alpine镜像的二进制文件没有可执行权限,哪怕文件存在也会被判定为找不到可执行文件
- 原Dockerfile里
go get -d -v的依赖拉取方式在Go modules模式下兼容性差,很可能依赖拉取失败导致编译步骤根本没生成二进制文件
可直接使用的修复版Dockerfile
FROM golang:1.15 as builder WORKDIR /src/github.com/devinotelecom/prometheus-vmware-exporter COPY ./ . # 优先用go mod下载依赖,兼容性更好 RUN go mod download # 显式指定输出二进制文件名,固定编译参数保证alpine兼容性 RUN CGO_ENABLED=0 GOOS=linux go build -o prometheus-vmware-exporter . FROM alpine:3.8 # 拷贝时直接赋予可执行权限,放到PATH默认包含的/usr/local/bin目录 COPY --from=builder --chmod=755 /src/github.com/devinotelecom/prometheus-vmware-exporter/prometheus-vmware-exporter /usr/local/bin/prometheus-vmware-exporter EXPOSE 9512 ENTRYPOINT ["prometheus-vmware-exporter"]
验证流程
按顺序执行以下命令排查确认:
- 重新构建镜像,注意观察编译阶段的日志有没有报错:
docker build -t prometheus-vmware-exporter . - 构建完成后先验证二进制是否正常存在于镜像中,跳过默认ENTRYPOINT执行ls命令查看文件:
docker run --rm --entrypoint ls prometheus-vmware-exporter -l /usr/local/bin/prometheus-vmware-exporter
正常会输出类似-rwxr-xr-x 1 root root 123456 Jan 1 00:00 /usr/local/bin/prometheus-vmware-exporter的结果,如果提示No such file or directory说明编译或拷贝步骤失败 - 确认文件存在后正常启动容器即可:
docker run -d -p 9512:9512 prometheus-vmware-exporter
其他注意事项
- 如果你的项目根目录下没有
go.mod文件,先在本地项目目录执行go mod init github.com/devinotelecom/prometheus-vmware-exporter生成模块配置文件,否则依赖拉取步骤会失败 - 不要使用你注释里写的拷贝到
/home/gsquire/exporter/的路径,该路径不在系统默认PATH中,直接写文件名作为ENTRYPOINT会找不到文件,如果一定要放到自定义路径,ENTRYPOINT要写全路径,比如ENTRYPOINT ["/home/gsquire/exporter/prometheus-vmware-exporter"]
内容的提问来源于stack exchange,提问作者Alfiethecat99
相关产品推荐
相关产品推荐

