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