Docker 容器中 运行 时 Spring Boot 中的 FileNotFoundException

FileNotFoundException in SpringBoot when running in Docker Container

我的 Springboot 应用程序在 IDE 中 运行 正常,但是当我在 docker 上创建 fat jar 文件和 运行 时,它给出了错误。我正在将我的应用程序与 firebase 连接,所以我想包含资源文件夹中的 serviceAccountKey.json 文件。应用程序 运行 在我的 ide 中运行良好,但是在 docker 容器上部署它时出现文件未找到的错误。虽然当包含文件并打印它的路径时它不会给出任何类型的错误。但是当我将文件路径提供给 fileInputStream 时,它会产生错误。我尝试了多种方法,但似乎没有任何效果。我使用 classLoader.getResource("filename.json").

包含文件

我试图跳过文件的包含并通过将文件内容保存在一个字符串中然后将其发送到流来做到这一点,但是每当我查询 firebase 时这种方法都会使服务器崩溃。

这是发生错误的代码。请注意,我正在打印文件路径,它会在显示错误之前打印在输出中。我也尝试过 file.getAbsoluteFile 而不是路径,但没有用。可能我做错了,或者我可能不得不在其他我不知道的地方提到路径。如果以前有人这样做过,请帮助我。

正在打印文件路径,但 FileStream 无法获取

除了在与应用程序打包在一起的 json 文件中拥有凭据之外,您还可以在启动应用程序时设置一个环境变量,然后通过 application.yml 加载密钥.这样,您就不需要将秘密打包到应用程序 jar 文件中。

1。创建配置 class

@Configuration
@ConfigurationProperties(value = "my-custom-config")
public class MyConfig {
    private String serviceAccountKey;

    // getters/setters etc. if not using lombok
}

2。使用上面的配置

通过注入配置 class 在其他 spring beans 中,并使用 getter 检索秘密,例如config.getServiceAccountKey();

3。将配置添加到您的 application.yml 文件

# application.yml
my-custom-config:
    serviceAccountKey: ${ENV_VARIABLE_NAME} # <---- this way you can bind an env variable to your config.

4。启动时在容器中定义环境变量

在实例化 docker 容器时,提供 env 选项并定义一个环境变量。

docker run -env ENV_VARIABLE_NAME=<value> ...