Docker复制除某些文件/文件夹外的所有文件和文件夹



Dockerfile复制命令允许golang regex。但是使用regex,我不能省略特定的文件夹。

例如,如果目录具有:-

public
dist
webapp
somefile.txt
anotherfile.txt

现在,我应该如何编写COPY的表达式,使其省略"webapp"并复制所有其他文件和文件夹?

注意:我知道我可以把它放在.dockerignore中,但在同一Dockerfile的后期构建阶段,我想复制那个文件夹-"webapp">

您有两个选择:

  1. 列出要直接复制的所有目录:

    COPY["foldera","folderc","olderd",…,"/dstPath]

  2. 尝试排除一些路径,但也要确保所有路径模式都不包括我们想要排除的路径:

    COPY["文件夹[^b]*"、"文件*"one_answers"/dstPath"]

此外,您还可以阅读有关本期可用解决方案的更多信息:https://github.com/moby/moby/issues/15771

带排除项的COPY解决方案

我有一个PHP+Node应用程序,包含node_modulesvendor目录,并有适当的层缓存。

我想通过将一些文件从复制中排除来排除我的依赖项,但由于DockerCOPY不支持排除,我采取了不同的方法,将我的依赖关系缓存在不同的层中。

它采取了三个不同步骤的组合:

步骤1

编写在我的构建过程中标记node_modulesvendor目录的脚本:

tar -cf ./node_modules.tgz --directory=./src/node_modules .
tar -cf ./vendor.tgz --directory=./src/vendor . 
docker build ...
rm node_modules.tgz vendor.tgz
docker push ...

步骤2

使用.dockerignore忽略node_modulesvendor目录:

src/node_modules
src/vendor

步骤3

在复制我的源代码的其余部分之前,将tar文件添加到项目中:

ADD node_modules.tgz /var/www/node_modules
ADD vendor.tgz /var/www/vendor
COPY ./src /var/www

显然,当层被缓存时,以及当缓存无效时(例如,新包),第一次构建是缓慢的。

jason-kane的灵感来源于此:https://github.com/moby/moby/issues/15771#issuecomment-207113714

需要注意的是:我的vendornode_modules目录与源代码位于同一文件夹中。

最新更新