java - 如何从docker容器内的输入文件读取

标签 java docker containers

我有一个简单的java程序,它在docker容器内运行。

我在 Windows 上使用了 Eclipse - 但我创建了 Linux 容器(使用 Windwos docker 桌面)

我使用Powershell启动容器 镜像创建成功

我看到了这个帖子,但它对我没有帮助c++ program with docker 。我使用该答案中的解决方案时出错。

PS E:\Java\Test> docker run -v E:\Java\Test:\tt img \tt\in.txt

docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:349:启动容器进程导致“exec:”\\tt\\in.txt”:在以下位置找不到可执行文件$PATH":未知。

Dockerfile

FROM java:8
COPY  hello.jar app.jar
CMD ["java", "-jar", "app.jar", "pkg.hello"]



public static  void main(String[] args) throws Exception {
    String fileName ="E:\\Java\\Test\\in.txt";
    List<String> lines = Collections.emptyList();
    lines =   Files.readAllLines(Paths.get(fileName), StandardCharsets.UTF_8);
    Iterator<String> itr = lines.iterator(); 
    while (itr.hasNext()) 
      System.out.println(itr.next()); 
    }

任何想法,谢谢

最佳答案

新建 Docker 文件

FROM java:8

COPY  hello.jar app.jar

ENTRYPOINT ["java", "-jar", "app.jar", "pkg.hello"]

好吧,经过大量的试验和错误,我找到了一种解决方案,可能不止一种。我想为那些像我这样不太专业的人解释一下,

据我们所知,docker 在容器内制作了一个类似迷你操作系统的东西,我的意思是所需的库和文件+我们开发的应用程序。我尝试运行并查看在 docker 中运行时目录中的内容。通过在 Windows 上的 Eclipse 上运行,它会显示常规路径 E:\Java\....但是当我在 docker 上运行它时,它只显示“/”。然后我尝试查看内容。在 Windows 上,当前目录中的文件和文件夹,但在 docker 上,它显示一些与 LINUX 根路径文件夹相同的文件夹,bin sbin mnt proc 等。 所以我意识到有一个迷你 Linux。 我知道这个事实,但从未见过这个结果。所以显然 in.txt 不存在于 docker 文件系统中。 现在我们看到了像 -v 这样的 docker 功能。它允许我们将一个目录从主机(即 Windows)复制/粘贴到 docker 容器文件系统。运行此命令后,我看到一个名为 data 的新文件夹被添加到 docker 文件夹中

docker run -v ${pwd}:/data img

pwd(Win 上的当前目录)的全部内容与 in.txt 一起复制到数据目录。现在我的java程序应该在docker内部运行,所以我需要更改硬编码路径。

String fileName ="data//in.txt"; 

它肯定不适用于 Windows,因为我的文件夹中没有\data\in.txt。 无论如何,我可以通过获取一些参数并跳过硬代码来做到这一点。有很多方法。我添加了代码来查看 Dir 状态,您可能想尝试一下。

String d = System.getProperty("user.dir");
    File f = new File(d);
    File filesList[] = f.listFiles();
    for(File file : filesList) {
         System.out.println("File name: "+file.getName());
         System.out.println("File path: "+file.getAbsolutePath());
         if (file.getName().equals("data")==true)
         {
             File filesList2[] = file.listFiles();
             for(File file2 : filesList2) {
             System.out.println("File name: "+file2.getName());
             System.out.println("File path: "+file2.getAbsolutePath());
             }
             
         }
         System.out.println(" ");
      }

关于java - 如何从docker容器内的输入文件读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63442283/

相关文章:

java - 如何在 Java 中使用 HttpClient 检索二进制文件?

java - (?<=#!)(\\w+\\.*\\w+)+ 与 #!super.compound.key3 不匹配

Java 在方法中抛出异常的最佳方式

NGINX-代理 : Running multiple ports tied to different virtual hosts on one container

docker - 在ubuntu 18.10上的docker-compose输入设备不是TTY错误

node.js - 如何超时终止 docker 容器?

windows - Windows容器-文化设置

c++ - 将多种类型的模板化类存储到容器中

java - java是否在内部创建持有main方法的类的对象?

c++ - 为什么容器的分配器作为模板参数传递?