我是 quarkus 和 Docker 的新手,所以这可能是一个简单的问题,但不幸的是文档在这里没有帮助我。
我的 quarkus 微服务被编译为本机可执行文件,然后编译为 docker 映像,需要使用机密。
我遵循了这个文档: https://quarkus.io/guides/config-secrets
尤其是KeyStore部分。现在缺少的部分信息是密钥库文件应该所在的位置。我猜他们假设它位于 quarkus 项目的根目录中,因为配置如下:
smallrye.config.source.keystore."properties".path=properties
只给出“属性”作为路径。
如果您将密钥库文件(称为属性)放入项目的根目录中,它确实可以工作。
但在我看来,当您按照说明构建本机可执行文件时,此密钥库文件会构建到 docker 映像中
quarkus build --native --no-tests -Dquarkus.native.container-build=true -DDquarkus.container-image.build=true
以及之后的 docker 镜像。
docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/keystore-test .
现在我不想将我的秘密“硬编码”存储在我的 docker 镜像中。
那么我如何告诉 quarkus 密钥库文件将在运行时的特定位置提供给容器呢?我已经尝试设置了
smallrye.config.source.keystore."properties".path=/some/local/path
到 quarkus 项目之外的某个路径。它确实有效并且可以编译,但密钥库文件似乎位于映像内,因为从该位置删除密钥库文件并重新启动容器后,应用程序仍然知道密钥库文件中的值。
那么我们如何提供容器在启动时获取的外部密钥库文件?
好吧,在阅读了有关 docker 的更多内容并摆弄之后,我发现了一些有用的东西。
在我的 application.properties 文件中,我指定了一些主机上不存在的组成路径:
smallrye.config.source.keystore."properties".path=/my/made/up/path/properties.jks
然后我像往常一样构建本机可执行文件和 docker 映像。如果我现在按照生成的 Dockerfile 中的文档建议启动它(src/main/docker/Dockerfile.native-micro)
docker run -i --rm -p 8080:8080 quarkus/keystore-test
正如我所料,我得到了一个错误
Failed to load config value of type class java.lang.String for: my.secret
现在,当我像这样启动 docker 容器时传递卷挂载时
docker run -v /actual/path/on/your/host/properties.jks:/my/made/up/path/properties.jks -i --rm -p 8080:8080 quarkus/keystore-test
容器拾取它并且 quarkus 可以访问它。 如果我删除“/actual/path/on/your/host/properties.jks”并重新启动容器,它会按预期失败。
但我认为这些东西可以成为 Docker 文件的一部分,因此可能有一些方便的方法来做到这一点“quarkus 方式”。也许不是。
这至少有效。不过,仍然感谢更多答案。