如何解决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 举报,一经查实,本站将立刻删除。