Docker构建使用JNI的Go应用时提示jni.h不存在报错如何解决
问题修复方案
错误原因
构建阶段仅安装了OpenJDK的JRE运行包,JRE仅提供Java程序运行能力,不包含JNI开发所需的jni.h等头文件,同时未配置CGO的头文件搜索路径,导致编译时无法找到对应头文件。
修复步骤
- 替换构建阶段的JDK安装包:将BUILD镜像中安装的
openjdk8-jre替换为完整的openjdk8开发包,获取JNI开发所需头文件 - 配置CGO环境变量:指定JNI头文件和库文件的搜索路径,让CGO编译器可以找到对应依赖
- 补全运行阶段的JRE依赖:运行镜像中需要安装
openjdk8-jre,保证应用运行时可以正常调用JNI相关逻辑 - 修复原有Dockerfile的语法错误:FINAL阶段的apk安装命令中缺少
&&连接符,会导致命令执行失败
修改后完整Dockerfile
FROM golang:alpine as BUILD ENV GO111MODULE=auto # 配置CGO头文件和库文件搜索路径,对应alpine中openjdk8的默认安装路径 ENV CGO_CFLAGS="-I/usr/lib/jvm/java-1.8-openjdk/include -I/usr/lib/jvm/java-1.8-openjdk/include/linux" ENV CGO_LDFLAGS="-L/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server -ljvm" ENV LD_LIBRARY_PATH="/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server" RUN apk update && \ apk upgrade && \ apk add git unzip openssl-dev build-base gcc musl-dev openjdk8 COPY . /go/src/project WORKDIR /go/src/project RUN go get -d -v RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -o /go/dist/app FROM alpine:latest AS FINAL COPY --from=BUILD /go/dist/app /project-runtime/app RUN apk update && \ apk add tzdata apr ca-certificates openssl openjdk8-jre && \ rm -rf /var/cache/apk/* RUN update-ca-certificates # 运行时也需要配置库文件路径找到jvm库 ENV LD_LIBRARY_PATH="/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server" WORKDIR /project-runtime ENTRYPOINT ["./app"]
内容的提问来源于stack exchange,提问作者Nomad
相关产品推荐
相关产品推荐

