如何用jar文件准备docker镜像/容器/ dockerfile



我是新来的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:/ . 

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

你应该使用bind挂载方式挂载一个目录到你的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中的参数。该命令可以在执行映像时被覆盖:

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

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

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

最新更新