Dockerfile - 只复制与特定扩展名匹配的文件,并保持文件夹结构

4
假设我有一个非常嵌套的文件夹结构,里面有很多项目文件:
src
  projectA
    projectA.csproj
    someFile.txt
  projectB
    projectB.csproj
    someFile.txt
  projectC
    projectC.csproj
    someFile.txt

在这种情况下,我希望我的DockerFile可以复制整个文件夹结构,但只包含.csproj文件:
src
  projectA
    projectA.csproj
  projectB
    projectB.csproj
  projectC
    projectC.csproj

我可以逐行处理每个文件,但有没有更简洁的方法?
COPY src/projectA/projectA.csproj src/projectA/projectA.csproj
COPY src/projectB/projectB.csproj src/projectB/projectB.csproj
COPY src/projectC/projectC.csproj src/projectC/projectC.csproj

.dockerignore 文件我认为 - LinPy
在Dockerfile中尝试使用RUN指令,结合Linux命令"cp --parents src//*.csproj ."。最终的命令应该是"RUN cp --parents src//*.csproj .",如果需要的话可以使用-r标志。 - Vaibhav Jain
@VaibhavJain,我无法测试你的建议。 - Stefano
COPY src/project*/*.csproj src/ 但是它不会保持目录结构。 - Adiii
@Adiii,不仅如此,它还会覆盖同名的文件。 - Stefano
我没有验证,但我认为有一种方法可以解决。但你可以验证一下 Add Src/Stock*/*.csproj Src/ RUN ls /app/Src - Adiii
2个回答

5

我曾经遇到过类似的情况,唯一的解决方案是准备一个包含所需内容的.tgz文件,并使用ADD指令将其复制到docker镜像中。

例如,这是一个类似于我使用的run.sh脚本:

#!/bin/bash

tar cvfz csproj.tgz $( find src -name "*.csproj" )
docker build -t test .
docker run -it --rm test

这是一个测试的Dockerfile:

FROM alpine
RUN mkdir /src
ADD csproj.tgz /src
CMD ls -alR /src

这个解决方案并不是很理想,但在当时确实完成了我所需要的工作。 ADD 指令(来源:https://docs.docker.com/engine/reference/builder/#add)能够复制文件(类似于 COPY 指令),并且如果它指向一个本地的tar归档文件并使用了一种被识别的压缩格式(如identity、gzip、bzip2或xz),那么它会被解压成一个目录。来自远程 URL 的资源不会被解压缩。

1

我知道这是一个老问题,但我遇到了同样的问题,并以不同的方式解决了它:

COPY src/*/*.csproj ./
RUN find . -type f -name "*.csproj" -exec sh -c 'export dir_name=$(basename "$1" .csproj); mkdir -p "src/${dir_name}"; mv "$1" "src/${dir_name}/"' shell {} \;

我正在使用find重新创建文件夹结构。首先,我获取所有具有.csproj扩展名的文件,并使用-exec运行一些命令:
  • export dir_name=$(basename "$1" .csproj)将创建一个名为dir_name的变量,该变量与文件名相同,但不包括扩展名。
  • mkdir -p "src/${dir_name}"将在src目录中创建一个以刚刚创建的变量命名的目录。
  • mv "$1" "src/${dir_name}/"将刚刚找到的文件移动到刚刚创建的目录中。
这样做可能不太美观,但对于特定情况来说是有效的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接