Dockerfile copy命令允许使用golang正则表达式。但是使用正则表达式,我无法省略特定的文件夹。
例如,如果目录具有:-
public
dist
webapp
somefile.txt
anotherfile.txt
现在,我应该如何为COPY编写表达式,使其忽略“ webapp
”并复制所有其他文件和文件夹?
注意:我知道我可以将其放入.dockerignore,但是在以后的构建阶段中,在同一Dockerfile中,我想复制该文件夹-'webapp
'
答案 0 :(得分:0)
您有两种选择:
列出要直接复制的所有目录:
COPY [“ foldera”,“ folderc”,“ folderd”,...,“ / dstPath]
尝试排除一些路径,但还要确保所有路径模式都不包括我们要排除的路径:
COPY [“ folder [^ b] *”,“ file *”,“ / dstPath”]
您还可以阅读有关本期可用解决方案的更多信息:https://github.com/moby/moby/issues/15771
答案 1 :(得分:0)
我有一个 PHP + Node 应用程序,带有 node_modules
和 vendor
目录,并带有层缓存。
我希望通过从复制中排除某些文件来排除我的依赖项,但由于 Docker COPY
不支持排除项,因此我采用了不同的方法,将我的依赖项缓存在不同的层中。
它结合了 3 个不同的步骤:
在我的构建过程中编写 tarring node_modules
和 vendor
目录的脚本:
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 ...
使用 .dockerignore
忽略 node_modules
和 vendor
目录:
src/node_modules
src/vendor
在复制我的其余源代码之前,将 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
还有一点需要注意:我的 vendor
和 node_modules
目录与源代码在同一个文件夹中。