我正在用java编写微服务。最后,我运行Maven构建以基于目录中的Dockerfile生成Docker映像。某些文件需要复制到Docker映像中。因此,我的Dockerfile中有以下行:
# HDFS base image
FROM mdouchement/hdfs
COPY ${workdir.name} /${workdir.name}
COPY ${resource.dir} /etc/hadoop
变量workdir.name
和resource.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上构建它并遇到相同的错误。
根据这篇文章,SRC路径应该是构建上下文的相对路径。这就是为什么绝对路径不起作用的原因。但是Docker构建的默认PATH
是什么?它与Dockerfile的目录相同吗?
您是否尝试将第二个变量声明为:
<resource.dir>${project.baseDir}/src/main/resources</resource.dir>
与基于基础。
通过添加:
将POM中的共享/共同资源包括<resources>
<resource>
<directory>/absolute/path/to/resources</directory>
<includes>
<include>**/*</include>
</includes>
<targetPath>shared</targetPath>
</resource>
</resources>
然后(如果使用Spotify Dockerfile Maven插件(将构建中的资源路径添加为构建参数
<configuration>
...
<buildArgs>
...
<SHARED_RESOURCES>target/classes/shared</SHARED_RESOURCES>
</buildArgs>
</configuration>
然后在Dockerfile中使用它:
...
ARG SHARED_RESOURCES
COPY ${SHARED_RESOURCES}/something /target
...