我有一个多模块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。
答案 0 :(得分: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_a
,common_module
和module_b
将包含在构建上下文中。