【问题标题】:Writing to a file in a folder while running a JAR on Docker Container results in FileNotFoundException在 Docker 容器上运行 JAR 时写入文件夹中的文件会导致 FileNotFoundException
【发布时间】:2020-05-25 08:13:14
【问题描述】:

我在 Docker 容器中运行 JAR。我的应用程序的功能是连接到数据库并获取记录并将其输出到名为报告的文件夹中的 .csv 文件。

我的 src 文件夹和报告文件夹都在同一个目录中。这意味着我可以像下面这样写入文件。

String csvFile = "." + File.separator + "reports" + File.separator + "VAS_Report_" + subscriberType +
                df.format(new Date()) + ".csv";

//db connection and result extraction logic
........

CSVWriter csvWriter = new CSVWriter(new FileWriter(csvFile));
csvWriter.writeAll(resultSet, true);

当我在本地运行程序时,这工作正常。我构建项目并将其捆绑为 JAR 文件。

我创建了一个包含其他相关步骤和以下步骤的 dockerfile(在我的 JAR 将被复制的文件夹中创建一个名为 reports 的文件夹)

RUN mkdir -p /apps/Consumer/
COPY My-App-1.0.jar /apps/Consumer/

RUN mkdir -p /apps/Consumer/reports
RUN chmod ugo+w /apps/Consumer/reports #giving write permission

Docker 镜像构建成功,数据库连接成功,并且在运行时尝试写入 csv 文件时,应用程序抛出异常,指出它找不到指定的文件夹/文件(FileNotFound 异常)。

我在这里做错了什么?

以下是在寻找解决方案时遇到的其他问题。

捆绑应用程序会保留项目结构吗? (因为我需要在 docker 容器中手动创建一个名为 reports 的文件夹) 我是否需要以任何方式为创建的文件夹(报告)提供权限? (我在这里做了)

【问题讨论】:

    标签: java docker jar dockerfile filenotfoundexception


    【解决方案1】:

    代替:

    RUN mkdir -p /apps/Consumer/
    ...
    RUN mkdir -p /apps/Consumer/reports
    

    WORKDIR 用作:

    WORKDIR /apps/Consumer/
    COPY My-App-1.0.jar .
    RUN chmod ugo+w /apps/Consumer/reports #giving write permission
    

    【讨论】:

    • 感谢您的回复。以上也会导致相同的 FileNotFoundException。
    • 能否请您发布完整的 Dockerfile?
    • 对不起,我之前弄错了。我的 WORKDIR 命令被下面的另一个 WORKDIR 语句覆盖。你的解决方案奏效了。非常感谢..!!!
    • 顺便说一下,不需要为所需文件夹设置权限。我猜默认情况下它对用户具有 -rwx 权限。
    猜你喜欢
    • 2023-03-27
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    相关资源
    最近更新 更多