我正试图从maven中创建一个docker映像,其中包括来自不同maven项目的工件。但我复制的例子似乎不起作用。
我认为这里的问题是我真的不了解组装是如何工作的,所以我想在这里寻求帮助。我建立了一个人为的简单例子来说明我在这里要做的事情:
https://github.com/sodved/java-docker-demo/tree/0.0.1-0
pom.xml
sod-java/pom.xml
sod-java/src/main/java/sodved/Sod.java
sod-docker/pom-depency.xml
sod-docker/pom.xml
sod-docker/src/main/docker/setup.sh
sod-docker/src/main/docker/Dockerfile
sod-docker/src/main/docker/run.sh
所以我的项目有两个模块:
- sod java,它构建了一个可执行jar(只向
/tmp/sod.txt
写入一个文件( - sod docker,它使用Dockerfile创建了一个java高山图像
- setup.sh在构建映像时运行。它运行java来创建
/tmp/sod.txt
- run.sh是写入
/tmp/sod.txt
文件内容的默认命令
- setup.sh在构建映像时运行。它运行java来创建
到目前为止,我已经尝试了两种内联<assembly>
的方法:
- https://github.com/sodved/java-docker-demo/blob/0.0.1-0/sod-docker/pom-depency.xml这是我的第一次尝试。在程序集中使用
dependecySet
。但我注意到,依赖项甚至没有包含在/target
文件夹中(我认为是因为在sod docker中没有实际的java代码可编译,所以没有复制依赖项( - https://github.com/sodved/java-docker-demo/blob/0.0.1-0/sod-docker/pom.xml这是我的第二次尝试。它首先显式地将工件复制到
/target
文件夹中(有效(。然后在程序集中使用file
尝试复制该文件
在这两种情况下,我都没有看到程序集或docker插件创建的tar文件中复制的jar文件,因此我在DockerfileCOPY
命令中尝试引用jar时出错。
我知道这个例子有点做作。但它很简单,符合我们在工作中做事的标准方式。所以我在工具、布局等方面没有太多的灵活性。
实际案例用于构建数据库映像。获取基本映像,运行java代码来操作数据库,保存为新映像以供下游使用。
TLDR:如何指定groupId、artifactId和版本,并在我的docker映像中包含相应的工件。docker源代码本身不包含java。
好的,已经解决了。
问题是pom.xml指定了一些外部配置
<external>
<type>properties</type>
<prefix>docker</prefix>
<mode>override</mode>
</external>
但作为这里的医生(http://dmp.fabric8.io/#property-configuration(表示,这意味着pom.xml中的<build>
配置(包括我的程序集(将被忽略。我不确定为什么我们的标准使用外部配置,会在这方面追上我们的操作人员。但去掉这个<external>
部分,一切都会成功。