【问题标题】:How to configure a standard path in a container created by Jib如何在 Jib 创建的容器中配置标准路径
【发布时间】:2021-03-21 14:18:47
【问题描述】:

我有一个标准的 Sprinb Boot 项目。

在文件夹:src/main/resources/tmp/my_file.json,我有一个我在 Java 代码中读取的 json。


File file = new File("src/main/resources/tmp/my_file.json");

在本地运行时完美运行

我使用 Jib 创建了一个 docker 映像:


<plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>2.5.2</version>
                <configuration>
                    <from>
                        <image>adoptopenjdk:11-jre-hotspot</image>
                    </from>
                    <to>
                        <image>xxx/my_project:${version}</image>
                    </to>
                    <container>
                        <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
                    </container>
                </configuration>
            </plugin>

当我运行容器时,它给了我一个找不到文件的错误:

java.io.FileNotFoundException: src/main/resources/tmp/my_file.json (No such file or directory)

“src/main/resources”文件夹是静态资源的标准位置。

我应该向 Jib 添加任何额外的配置以使文件可用吗?

【问题讨论】:

    标签: jib


    【解决方案1】:

    您不希望您的应用程序打开基于源项目结构的文件。在运行时(无论是打包为 JAR 文件还是容器镜像),您将没有 src/ 目录,new File("src/...") 将始终失败。例如,即使在 Docker 上下文之外,假设您将应用程序打包为可运行的 jar。然后使用java -jar &lt;your-runnable.jar&gt; 运行您的应用程序将因同样的错误而失败。

    Java 人员通常做的是在类路径上搜索文件,这几乎是您想要实现的目标的标准方法。 google“java get resources”可以找到很多有用的资料,这里有一些参考:


    截至目前,Jib 2.7.0 是最新的。

    【讨论】:

      【解决方案2】:

      问题不在于 Jib,而在于您的代码。
      将“src/main/resources/”放在类路径上——这是一种标准方式。并修改您的代码如下:

      File file = new File("tmp/my_file.json");
      

      当 Jib 创建一个图像时,它会将所有资源从“src/main/resources/”复制到图像上的一个目录(“/app/resources”),并在启动应用程序时将该目录放在类路径中。

      【讨论】:

        猜你喜欢
        • 2021-03-21
        • 2020-02-27
        • 2016-06-24
        • 1970-01-01
        • 2020-08-01
        • 2021-10-02
        • 2020-03-04
        • 1970-01-01
        相关资源
        最近更新 更多