GitLab CI/CD基于docker:stable镜像执行java命令提示not found求助
解决GitLab流水线中Java命令找不到的问题
问题根源
你用的docker:stable镜像基于Alpine Linux,默认使用musl libc,但Oracle提供的GraalVM JDK二进制包是针对glibc编译的,两者底层C库不兼容,所以哪怕PATH配置正确,也会因为动态链接库缺失导致java: not found的错误——这不是路径问题,是程序无法在musl环境下运行。
三种可行解决方案
方案一:在Alpine镜像中添加glibc兼容层
通过安装第三方兼容包,让Alpine支持glibc编译的程序:
build: image: docker:stable stage: build script: # 安装glibc兼容依赖 - apk add --no-cache curl binutils - curl -L https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.38-r0/glibc-2.38-r0.apk -o glibc.apk - curl -L https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.38-r0/glibc-bin-2.38-r0.apk -o glibc-bin.apk - apk add --no-cache glibc.apk glibc-bin.apk - rm glibc.apk glibc-bin.apk # 原有的GraalVM配置步骤 - wget https://download.oracle.com/graalvm/23/latest/graalvm-jdk-23_linux-x64_bin.tar.gz - tar -xvf graalvm-jdk-23_linux-x64_bin.tar.gz - mv graalvm-jdk-23.0.1+11.1 /opt/ - export JAVA_HOME='/opt/graalvm-jdk-23.0.1+11.1' - export PATH="$JAVA_HOME/bin:$PATH" - java --version # 后续maven下载、native image编译、docker推送步骤 variables: DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" DOCKER_TLS_VERIFY: 1 DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client" services: - docker:dind
方案二:换用基于glibc的Docker镜像
放弃Alpine基础镜像,改用基于Debian(自带glibc)的docker镜像,比如docker:24.0.6:
build: image: docker:24.0.6 stage: build script: - wget https://download.oracle.com/graalvm/23/latest/graalvm-jdk-23_linux-x64_bin.tar.gz - tar -xvf graalvm-jdk-23_linux-x64_bin.tar.gz - mv graalvm-jdk-23.0.1+11.1 /opt/ - export JAVA_HOME='/opt/graalvm-jdk-23.0.1+11.1' - export PATH="$JAVA_HOME/bin:$PATH" - java --version # 后续maven下载、native image编译、docker推送步骤 variables: DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" DOCKER_TLS_VERIFY: 1 DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client" services: - docker:dind
方案三:直接使用GraalVM官方镜像
如果流水线核心是用GraalVM编译native image,直接用官方预装JDK的镜像,只需额外安装docker客户端即可:
build: image: ghcr.io/graalvm/jdk:23 stage: build script: # 安装docker客户端以支持后续推送操作 - apt-get update && apt-get install -y docker.io - java --version # 后续maven下载、native image编译、docker推送步骤 variables: DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" DOCKER_TLS_VERIFY: 1 DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client" services: - docker:dind
内容的提问来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

