如何从Docker容器中的输入文件读取

问题描述

我有一个简单的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

泊坞窗:来自守护程序的错误响应: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()); 
    }

任何想法,谢谢

解决方法

我认为在这种情况下,您将需要使用ENTRYPOINT而不是CMD。简而言之:

在运行容器时使用CMD时,容器名称旁边的指令将成为新的CMD(从这里出现错误"\\tt\\in.txt": executable file not found in $PATH": unknown)。另一方面,使用ENTRYPOINT,在容器名称之前添加的指令将作为附加参数添加。

检查this article,以获取有关CMDENTRYPOINT的详细说明。

,

新的Docker文件

FROM java:8

COPY  hello.jar app.jar

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

好几次尝试和错误后,我找到了一种解决方案,可能不止一种。我想为像我这样不是很熟练的人解释一下,

我们知道docker在容器内制造了类似mini OS的东西,我的意思是所需的库和文件 + 是我们开发的应用程序。我尝试在docker中运行时查看目录中的内容。通过在Windows上的Eclipse上运行,它会显示常规路径 E:\ Java \ .... 但是当我在docker上运行它时,它仅显示“ /”。,然后我尝试查看其中的内容。在Windows上,当前Dir内部的文件和文件夹,但是在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(" ");
      }