Docker COPY除部分文件/文件夹外的所有文件和文件夹

时间:2019-01-29 06:59:59

标签: docker dockerfile

Dockerfile copy命令允许使用golang正则表达式。但是使用正则表达式,我无法省略特定的文件夹。

例如,如果目录具有:-

public
dist
webapp
somefile.txt
anotherfile.txt

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

注意:我知道我可以将其放入.dockerignore,但是在以后的构建阶段中,在同一Dockerfile中,我想复制该文件夹-'webapp'

2 个答案:

答案 0 :(得分:0)

您有两种选择:

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

    COPY [“ foldera”,“ folderc”,“ folderd”,...,“ / dstPath]

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

    COPY [“ folder [^ b] *”,“ file *”,“ / dstPath”]

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

答案 1 :(得分:0)

复制与排除工作

我有一个 PHP + Node 应用程序,带有 node_modulesvendor 目录,并带有层缓存。

我希望通过从复制中排除某些文件来排除我的依赖项,但由于 Docker COPY 不支持排除项,因此我采用了不同的方法,将我的依赖项缓存在不同的层中。

>

它结合了 3 个不同的步骤:

步骤 1

在我的构建过程中编写 tarring 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 目录与源代码在同一个文件夹中。