【问题标题】:How to prepare docker image/ container/ dockerfile with jar file如何使用 jar 文件准备 docker image/container/dockerfile
【发布时间】:2021-02-10 15:46:00
【问题描述】:

我是 Docker 新手。我有一个问题:我有一个处理“in.png”并将结果保存为单独文件的 jar 文件:out.png。我想创建一个 docker 映像并在其中放入一个 .jar 文件。重要的是 in.png 和 out.png 文件出现/在主机端交付。我想把所有东西都放在dockerhub上,最终让用户自己处理图形文件。这个问题的最佳解决方案是什么?我已经尝试过这样的事情(这是好的解决方案吗?):

FROM java:8
WORKDIR /
ADD Hello.jar in.png
EXPOSE 8080
CMD java - jar Hello.jar

但我无法将输出文件从容器复制(或者我不知道如何)到主机;

或者更好的解决方案是制作一个图像(Java / Ubuntu with Java?),上传一个 .jar 文件并为用户提供一组命令,例如:

docker cp Hello.jar 4e673836297e:/
docker cp in.png 4e673836297e:/
docker run ubuntu java -jar Hello.jar
docker cp 4e673836297e:/ . 

请告诉我这个问题的最佳解决方案是什么

【问题讨论】:

  • 与其在Docker中运行JVM,不如直接在宿主机上运行JVM?这将能够直接访问主机文件而无需特殊设置。

标签: java docker dockerfile dockerhub


【解决方案1】:

您应该使用绑定挂载将目录挂载到您的 docker 容器。

如果您的 jar 将输出写入/output/out.png,您可以使用以下命令基于您的图像启动一个容器。

docker run -v "$(pwd)":/output YOUR_IMAGE_NAME

该选项将当前工作目录挂载到容器内的/outpout 文件夹。所以写在那里的文件会在外面可见。

更详细的解释可以在这里找到:https://docs.docker.com/storage/bind-mounts/


编辑以回答附加问题:

你也可以使用挂载的文件夹作为输入,这样你就可以有不同的图像文件作为输入。

首先是简单的方法。 您可以将其命名为 workdir 并将当前目录挂载到它,而不是命名文件夹输出。

docker run -v "$(pwd)":/workdir YOUR_IMAGE_NAME

当您必须更改您的 Java 应用程序以从 /workdir/in.png 读取 in.png 时。用户必须在当前文件夹中将他的个人输入文件保存为in.png,然后才能运行 Docker 映像。

以下是一种更先进、更舒适的方法。 您更改 Dockerfile,使其包含入口点和命令。

FROM java:8
WORKDIR /
ADD Hello.jar in.png
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "Hello.jar"]
CMD ["in.png"]

执行此 docker 映像时,它会启动 java -jar Hello.jar,但添加了来自 CMD 的参数。执行图像时可以覆盖 CMD:

docker run -v "$(pwd)":/workdir YOUR_IMAGE_NAME custom.png

您必须更改您的程序,以便它接受第一个命令行参数作为工作目录中输入文件的名称。

然后用户可以告诉您的程序他或她的图像文件的名称。

【讨论】:

  • 感谢重播,但也许您知道,我如何提供输入图像(每次启动容器时的图像不同)?
  • 我添加了两种可能的方法。
猜你喜欢
  • 2019-11-21
  • 2023-03-11
  • 1970-01-01
  • 2021-09-15
  • 2023-01-30
  • 2018-09-03
  • 2019-05-16
  • 2021-07-18
  • 2014-10-07
相关资源
最近更新 更多