将本地目录绑定到 java 应用程序容器

Binding a local directory to java application container

您好,我是 docker 的初学者。

我正在使用 java 代码将我的输出文件保存在当前目录中,如下所示:

File currDir = new File(".");
String path = currDir.getAbsolutePath();
String fileLocation = path.substring(0, path.length() - 1) + "SavedFile.xlsx";
FileOutputStream outputStream = new FileOutputStream(fileLocation);
workbook.write(outputStream);
System.out.println("Excel file created.........");
workbook.close();

我构建了一个 DockerImage 并执行了容器。 我知道一旦容器完成执行,所有文件都会从中丢失。

我尝试在 mac 终端上使用以下命令将我的本地目录映射到容器

docker run --name mycontainer -v /users/myname/Desktop/OutputFolder : / myimage

docker run --name mycontainer -v /users/myname/Desktop/OutputFolder : / -it myimage

我收到以下消息:

docker: invalid reference format.

与此关联的docker文件如下:

# we will use openjdk 17
FROM openjdk:17

# copy the packaged jar file into our docker image
COPY out/artifacts/FileOnDocker_jar/FileOnDocker.jar /demo.jar

# set the startup command to execute the jar
CMD ["java", "-jar", "/demo.jar"]

我尝试登录容器

myname@xyz DockerTest % docker exec -it mycontainer /bin/bash

bash-4.4# pwd
/

由于这个原因,我使用 / 将外部目录映射到上面的 docker 运行 命令中的容器目录。

bash-4.4# ls -al
total 21156
drwxr-xr-x   1 root root     4096 Apr 30 11:47 .
drwxr-xr-x   1 root root     4096 Apr 30 11:47 ..
-rwxr-xr-x   1 root root        0 Apr 30 11:47 .dockerenv
lrwxrwxrwx   1 root root        7 Oct  9  2021 bin -> usr/bin
dr-xr-xr-x   2 root root     4096 Oct  9  2021 boot
-rw-r--r--   1 root root 21602227 Apr 30 08:07 demo.jar
drwxr-xr-x   5 root root      360 Apr 30 11:47 dev
drwxr-xr-x   1 root root     4096 Apr 30 11:47 etc
drwxr-xr-x   2 root root     4096 Oct  9  2021 home
lrwxrwxrwx   1 root root        7 Oct  9  2021 lib -> usr/lib
lrwxrwxrwx   1 root root        9 Oct  9  2021 lib64 -> usr/lib64
drwxr-xr-x   2 root root     4096 Oct  9  2021 media
drwxr-xr-x   2 root root     4096 Oct  9  2021 mnt
drwxr-xr-x   2 root root     4096 Oct  9  2021 opt
dr-xr-xr-x 188 root root        0 Apr 30 11:47 proc
dr-xr-x---   1 root root     4096 Apr 27 21:54 root
drwxr-xr-x   4 root root     4096 Apr 26 19:36 run
lrwxrwxrwx   1 root root        8 Oct  9  2021 sbin -> usr/sbin
drwxr-xr-x   2 root root     4096 Oct  9  2021 srv
dr-xr-xr-x  13 root root        0 Apr 30 11:47 sys
drwxrwxrwt   1 root root     4096 Apr 27 21:54 tmp
drwxr-xr-x   1 root root     4096 Apr 27 21:54 usr
drwxr-xr-x   1 root root     4096 Apr 26 19:36 var
bash-4.4# 

任何人都可以帮我解决我犯的错误吗?

提前致谢。

添加控制台代码:

Console console = System.console();
        System.out.println("Please enter your username: ");
        String username = console.readLine();
        System.out.println("Please enter your password: ");
        char[] passwordChars = console.readPassword();
        String password = new String(passwordChars);

首先是卷映射选项中不能有空格。即

docker run --name mycontainer -v /users/myname/Desktop/OutputFolder : / myimage

应该是

docker run --name mycontainer -v /users/myname/Desktop/OutputFolder:/ myimage

但这行不通,因为您正在将主机目录映射到映像的根目录。当你这样做时,你 'hide' 容器中根目录及其下方的所有内容,包括你的 .jar 文件。

您可以做的是将单个文件映射到输出文件。据我所知,容器中输出文件的文件名将是/SavedFile.xlsx。 为此,文件必须在启动容器之前存在于主机上,因此使用以下 2 个命令

touch /users/myname/Desktop/OutputFolder/SavedFile.xlsx
docker run --name mycontainer -v /users/myname/Desktop/OutputFolder/SavedFile.xlsx:/SavedFile.xlsx myimage

它应该可以工作,您应该在主机上的 /users/myname/Desktop/OutputFolder/SavedFile.xlsx 中获得输出。

最后总结汉斯的回答:

  1. 进行映射时不需要空格

docker run --name mycontainer -v /Users/myname/Desktop/OutputFolder/SavedFile.xlsx:/SavedFile.xlsx myimage

2:如果java应用程序输出了任何文件,请确保必须事先在本地目录中创建具有相同名称的相同文件,以便从容器中映射它。结果,本地目录中的文件将具有容器执行所需的数据 post。(例如:在我的例子中,我将其命名为 SavedFile.xlsx)

3:当您在容器内基于 java 的应用程序中使用控制台接受用户名或密码时,使用 -it 使控制台能够从键盘接受用户名和密码,否则会出现空指针异常会抛出。

因此最终命令如下:

docker run -it --name mycontainer -v /Users/myname/Desktop/OutputFolder/SavedFile.xlsx:/SavedFile.xlsx myimage

欢迎任何其他 suggestions/corrections。