在docker中使用外部jar依赖

Posted

技术标签:

【中文标题】在docker中使用外部jar依赖【英文标题】:using external jar dependency in docker 【发布时间】:2020-01-27 23:48:52 【问题描述】:

我正在使用通过 scope = system 添加的外部 jar,其中 $basedir/src/main/java/... 添加为 pom.xml 中的依赖子组下的系统路径。 每当我从 IntelliJ 本地使用项目时,都没有警告或错误。但是,当我尝试从 docker 容器启动 .jar 文件时,我得到了有关依赖项的异常。

我已经尝试通过 IntelliJ 中项目结构下的库添加罐子,并且只是将罐子添加到根目录下的 libs 文件夹中。 首先我提供了绝对路径,但后来我将其更改为 $basedir 因为绝对路径没有映射为 docker 容器上的卷。 有什么方法可以将外部 jar 与项目 jar 打包,以便我可以在 docker 容器中使用它?

【问题讨论】:

提供异常详情。 在主项目中,我从外部 jar 调用类的构造函数,但无法解析导入。 您需要向我们展示您是如何创建关于该部分的 docker 映像的。 它使用官方 flink docker 镜像的简单镜像,我只是将 jars 复制到其中.. FROM flink:1.9 COPY ./jars ./jars 【参考方案1】:

IIUC 你至少有两个选择:

1。将 JAR 添加到新图像(根据上面的 @LexByte 建议)。

假设 JAR 在您的主机上的 $PWD/jars 中,并且您希望它们在容器中的 $WORKDIR/jars 中:

FROM [[original-image]]
WORKDIR ...
COPY ./jars ./jars

然后,确保您的代码通过 [[WORKDIR]]/jars/[[some-jar]] 引用 JAR

NB [[WORKDIR]] 是您设置为容器工作目录的任何内容。

2。使用现有镜像将 JAR 挂载到容器中:

docker run ... --volume=$PWD/jars:[[WORKDIR]]/jars ...

NB [[WORKDIR]] 是您将用作容器工作目录的任何内容。这是将 JAR 安装到容器中的位置。

【讨论】:

我设法通过在 maven m2 文件夹中本地安装 jar 来解决问题。将 jars 添加为外部库,并在具有范围运行时的依赖项中引用它们。构建主项目 jar 将这些库包含在大 jar 中。之后我不需要在 docker 镜像中添加 jars。

以上是关于在docker中使用外部jar依赖的主要内容,如果未能解决你的问题,请参考以下文章

容器管理工具docker和容器的规范与依赖

dockerip包不分片

docker使用Dockerfile把springboot项目jar包生成镜像并运行

docker搭建maven私服(nexus3),整合springboot上传下载依赖

SBT:如何 Dockerize 一个胖罐子?

docker容器内怎么连接外部的mysql