微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Quarkus Image:无法运行程序“keytool”:错误=2,没有那个文件或目录

如何解决Quarkus Image:无法运行程序“keytool”:错误=2,没有那个文件或目录

我有一个在 Java 11 上运行并使用 Quarkus 框架的 Java 项目。在项目代码的某处有这样一行:

Process proc = Runtime.getRuntime()
                        .exec("keytool -keystore " + trustStore.toString() + " -alias postgresql " + "-storepass \""
                                + trustCredentials.toString() + "\" -noprompt -import -file " + caRoot.toString());

上面这行是使用 keytool 命令向信任库添加证书。

尝试将我的 java 项目构建到 Fast-Jar 中然后运行该 jar 时出现问题。找不到 Keytool 命令:

java.io.IOException: Cannot run program "keytool": error=2,No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1128) ~[?:?]
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1071) ~[?:?]
    at java.lang.Runtime.exec(Runtime.java:592) ~[?:?]
    at java.lang.Runtime.exec(Runtime.java:416) ~[?:?]
    at java.lang.Runtime.exec(Runtime.java:313) ~[?:?]

我不太明白为什么会发生这种情况。我知道 keytool 与 java 安装一起提供,我已经检查过,它似乎安装在我的图像上。我也知道 PATH 变量可能需要更新。但是,在 Linux 机器上(我的图像基于它),keytool 安装在 /usr/bin 下,这已经是路径的一部分。作为另一个测试,我还尝试在 java 代码中指定 keytool 的路径,即:

Process proc = Runtime.getRuntime()
                        .exec("/usr/bin/keytool -keystore " ...blah 

还是出现同样的错误。也许问题可能与 quarkus 如何构建其图像有关?

这大致是我在 gitlab-ci.yml 中构建快速 Jar 图像的方式:

- export JOB_CONTAINER_ID=`docker ps -q -f "label=com.gitlab.gitlab-runner.type=build" -f "label=com.gitlab.gitlab-runner.job.id=$CI_JOB_ID"`
      - export TOKEN=$CI_BUILD_TOKEN
      - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
      - |
         docker build -t temp-image-builder -f - . << EOF
         FROM ${dind_BUILD_IMAGE}
         copY . /project
         EOF
      - docker run --rm --privileged --name=temp-image-builder --user root -w /project
         -v /var/run/docker.sock:/var/run/docker.sock
         -e "CI_PROJECT_DIR=$CI_PROJECT_DIR" -e "TOKEN=$TOKEN" -e "QUARKUS_PROFILE=$QUARKUS_PROFILE" -e "TAG=$TAG"
         -e "IMAGE_NAME=${CI_REGISTRY_IMAGE}/${SERVICE_NAME}:${TAG}" -e "ENFORCE_RELEASE_GATE=on"
         -e "CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME" -e "GITLAB_USER_LOGIN=$GITLAB_USER_LOGIN"
         -e "CI_PROJECT_NAME=$CI_PROJECT_NAME" -e "CI_PROJECT_URL=$CI_PROJECT_URL" -e "CI_JOB_ID=$CI_JOB_ID"
         --entrypoint /bin/bash temp-image-builder:latest '-c'
            '
               ./gradlew -Pversion="${TAG}"
                  clean build
                  -Dquarkus.package.type=fast-jar
                  -Dquarkus.profile="${QUARKUS_PROFILE}"
                  -Dquarkus.jib.base-registry-username=gitlab-ci-token -Dquarkus.jib.base-registry-password="$TOKEN"
                  -Dquarkus.container-image.tag="${TAG}"
                  -Dquarkus.container-image.build=true
            '
      - docker push ${CI_REGISTRY_IMAGE}/${SERVICE_NAME}:${TAG}

${dind_BUILD_IMAGE} 是另一个基于 java-11 高山图像的图像。

试图解决这个问题真的很令人沮丧,这看起来很简单,但到目前为止我还没有运气。任何关于可能出错的建议将不胜感激。谢谢。

解决方法

事实证明这确实是一个 PATH 问题。我误认为 keytool 位于 usr/bin 下。使用这个名为 "dive" 的工具,我能够找出 keytool 所在的位置。不幸的是,我不确定是否可以使用 jib 将 PATH 变量更新到 keytool 所在的位置,但至少我可以运行 exec 并包含 keytool 路径(即 .exec(path/to/tool/keytool .exec(path/to/tool/keytool . ..blah)) 它将成功运行

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。