多阶段Docker构建拷贝Go gnostic包到Python镜像报exit 127如何解决
问题根因
- 复制指令语法错误:
COPY --from=golang /go/bin/gnostic /go/bin/gnostic-grpc该写法会将前一个二进制文件覆盖后一个,实际最终镜像中仅存在错误命名的可执行文件,缺少正常运行所需的两个二进制。 - 可执行文件路径未加入系统环境变量:即使复制路径正确,默认
/go/bin不在Python基础镜像的PATH范围内,系统无法找到命令,因此返回退出码127。 - Go二进制可能存在动态库依赖:默认编译的Go二进制如果开启了CGO,会依赖底层系统的glibc等动态库,跨镜像复制后可能存在依赖缺失问题。
解决方案
直接修改Dockerfile如下即可解决:
FROM golang:1.17 AS golang # 强制静态编译,消除动态库依赖 ENV CGO_ENABLED=0 # Go 1.17+ 推荐使用go install安装二进制包,替代废弃的go get RUN go install github.com/google/gnostic@latest RUN go install github.com/googleapis/gnostic-grpc@latest FROM python:3.7.10 WORKDIR /app ADD requirements.txt /app/ RUN pip install -r requirements.txt ADD . /app/ # 修正复制逻辑:将两个二进制统一复制到默认存在于PATH的/usr/local/bin目录下 COPY --from=golang /go/bin/gnostic /go/bin/gnostic-grpc /usr/local/bin/ CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "5000"]
修改后构建镜像,即可正常执行gnostic相关命令,同时保留多阶段构建镜像体积小、构建速度快的优势。
内容的提问来源于stack exchange,提问作者chicken dev
相关产品推荐
相关产品推荐

