如何使用docker maven插件将文件从绝对路径复制到docker镜像

时间:2017-04-20 16:38:16

标签: java maven docker path dockerfile

我正在用Java编写微服务。最后,我运行maven build来生成基于目录[project-root] / docker中的Dockerfile的Docker镜像。某些文件需要复制到Docker镜像中。因此,我的Dockerfile中有以下几行:

# HDFS base image
FROM mdouchement/hdfs
COPY ${workdir.name} /${workdir.name}
COPY ${resource.dir} /etc/hadoop

变量workdir.nameresource.dir在pom.xml中定义

<properties>
        <workdir.name>javarun</workdir.name>
        <resource.dir>${project.baseUri}/src/main/resources</resource.dir>
</properties>

虽然第一个复制命令使用相对于target/docker/javarun的相对路径,但第二个命令使用绝对路径。

事实证明第一个COPY工作正在我第二个COPY收到错误时说找不到目录:

[INFO] Building image docker.repo.lgc.com/distarch/com.lgc.dist.core.msp.service.hdfs
Step 1/3 : FROM mdouchement/hdfs
 ---> c95344e8749d
Step 2/3 : COPY javarun /javarun
 ---> e2e8cb5bc21f
Removing intermediate container f49da68fe77e
Step 3/3 : COPY file:/C:/Users/H184870/Workspace/core/com.lgc.dist.core.msp.service.hdfs//src/main/resources /etc/hadoop
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 14.906 s
[INFO] Finished at: 2017-04-20T11:07:12-05:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:0.3.10:build (docker-build) on project com.lgc.dist.core.msp.service.hdfs: 
Exception caught: lstat file:/C:/Users/H184870/Workspace/core/com.lgc.dist.core.msp.service.hdfs//src/main/resources: no such file or directory -> [Help 1]

打印出来的路径是/C:/Users/H184870/Workspace/core/com.lgc.dist.core.msp.service.hdfs//src/main/resources,看起来很奇怪。我的猜测是这不是一个有效的Windows路径。

我现在在Windows机器上运行它,但构建过程最终将转移到Linux服务器。在Dockerfile中复制文件时,如何使绝对路径与两个OS兼容?

编辑最初认为这是一个Windows路径问题,所以试图在Linux上构建它并得到同样的错误。

根据this post,src路径应该是构建上下文的相对路径。这就是为什么绝对路径不起作用的原因。但是docker build的默认PATH是什么?它与Dockerfile所在的目录相同吗?

2 个答案:

答案 0 :(得分:0)

您是否尝试将第二个变量声明为:

<resource.dir>${project.baseDir}/src/main/resources</resource.dir>

使用baseDir。

答案 1 :(得分:0)

通过添加以下内容在您的pom中包含共享/公共资源:

<resources>
    <resource>
        <directory>/absolute/path/to/resources</directory>
        <includes>
            <include>**/*</include>
        </includes>
        <targetPath>shared</targetPath>
    </resource>
</resources>

然后(如果使用spotify Dockerfile maven插件)将build上的资源路径添加为构建参数

<configuration>
    ...
    <buildArgs>
        ...
        <SHARED_RESOURCES>target/classes/shared</SHARED_RESOURCES>
    </buildArgs>
</configuration>

然后在Dockerfile中使用它:

...
ARG SHARED_RESOURCES
COPY ${SHARED_RESOURCES}/something /target
...