【问题标题】:How to copy files from an absolute path to docker image using docker maven plugin如何使用docker maven插件将文件从绝对路径复制到docker镜像
【发布时间】:2017-04-20 16:38:16
【问题描述】:

我正在使用 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 中复制文件时,如何使绝对路径兼容两种操作系统?

EDIT 本来以为是windows路径问题,于是尝试在Linux上构建,同样报错。

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

【问题讨论】:

  • 什么时候在你的 Dockerfile 中创建 /etc/hadoop?
  • @user2915097 它将 mdouchement/hdfs 作为基础图像,该部分在帖子中被遗漏了。

标签: java maven docker path dockerfile


【解决方案1】:

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

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

使用 baseDir。

【讨论】:

  • 已更改为 basedir(Dir 不起作用),但仍然出现相同的错误。根据this basedir 已弃用。
  • ${basedir} 已被弃用,但 ${project.basedir} 不是。
  • 我确实尝试过project.basedir,但还是一样。我注意到basedir 的一个区别是它打印出类似于 Windows 的路径 Step 3/3 : COPY C:\\Users\\H184870\\Workspace\\core\\com.lgc.dist.core.msp.service.hdfs/src/main/resources /etc/hadoop
【解决方案2】:

通过添加在您的 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
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    相关资源
    最近更新 更多