【问题标题】:Docker build fails to find source folder for COPY commandDocker build 找不到 COPY 命令的源文件夹
【发布时间】:2018-12-25 03:58:58
【问题描述】:

我有一个多模块 maven 项目,我想为每个模块创建和发布一个图像,除了一个通用的实用程序模块,它是所有其他模块的依赖项。

项目结构是这样的:

project_root
 common_module
    -pom.xml
 module_a
    -pom.xml
    -Dockerfile
 module_b
    -pom.xml
    -Dockerfile
 -pom.xml
 -docker-compose.yml

要构建 module_a fox 示例,我需要将 common_module 文件夹也复制到容器中,并首先在 common 文件夹上运行 mvn install。如果已构建,我也可以在 module_a 上运行 mvn install pom.xml

我是 Docker 新手,这是我一直在尝试的,我认为应该可以工作,根据 documentation of the COPY command,其中指出:

可以指定多个 src 资源,但文件和目录的路径将被解释为相对于构建上下文的源。

我在 module_a 中有以下 Dockerfile:

FROM openjdk:8-jre-alpine

# Install Maven
# (skipped for brevity)

# Create the project root
RUN mkdir -p /usr/src/project_root
WORKDIR /usr/src/project_root

# Copy all the necessary files for the packaging
# Copy the common module
COPY common_module /usr/src/project_root/common_module 
# Copy the service registry module (src + config folder)
COPY module_a /usr/src/project_root/module_a 

# Run maven install
RUN cd common_module 
RUN mvn clean install

RUN cd ../module_a 
RUN mvn clean install

从 project_root 文件夹发出这个命令(让它成为构建的上下文?):

docker build -t image_name:4.0 ./module_a

在第一个COPY 命令处构建失败,说明:

复制失败:stat /var/lib/docker/tmp/docker-builder380120612/common_module:没有这样的文件或目录

我什至不确定RUN 命令是否有效,因为在这些命令之前构建失败。

我做错了什么? 如何将文件夹/文件复制到 Dockerfile 位置之外?

顺便说一句,我在 Windows 10 Pro 上运行 Docker 版本 18.03.1-ce,构建 9ee9f40。

【问题讨论】:

    标签: java maven docker dockerfile docker-build


    【解决方案1】:

    当你运行命令时

    docker build -t image_name:4.0 ./module_a
    

    您将构建上下文定义为module_a 目录。然后您尝试将COPY 目录common_module 放入您的容器中,但这是不可能的,因为它不在构建上下文中。

    改用这个命令:

    docker build -t image_name:4.0 -f ./module_a/Dockerfile .
    

    这样module_acommon_modulemodule_b 将包含在构建上下文中。

    【讨论】:

    • 但是它无法在 module_a 文件夹中找到 Dockerfile(它只会在根文件夹中查找它)。我希望在根文件夹中运行该命令会将其标记为构建上下文 :( 如果我从 module_a 文件夹中运行带有“image_name .”的构建命令,那么我会发现 COPY 失败,因为公共文件夹不在构建上下文。据我所知,镜像名称后面的参数应该是 Dockerfile 位置。
    • 只需使用 `-f' 标志告诉 docker Dockerfile 在哪里。
    • 我也试过了,但它说构建命令只能有 1 个参数。你能给我举个例子,我应该如何使用 -t 和 -f 标志来格式化我的命令?
    • 查看我更新的答案,-f 选项必须在路径之前
    • 谢谢你的例子,复制命令现在有效,现在我只需要找出,为什么 maven 安装失败:) 编辑:结果最好使用 WORKDIR 命令而不是 cd
    猜你喜欢
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    相关资源
    最近更新 更多