Dockerfile复制命令允许golang regex。但是使用regex,我不能省略特定的文件夹。
例如,如果目录具有:-
public
dist
webapp
somefile.txt
anotherfile.txt
现在,我应该如何编写COPY的表达式,使其省略"webapp
"并复制所有其他文件和文件夹?
注意:我知道我可以把它放在.dockerignore中,但在同一Dockerfile的后期构建阶段,我想复制那个文件夹-"webapp
">
您有两个选择:
-
列出要直接复制的所有目录:
COPY["foldera","folderc","olderd",…,"/dstPath]
-
尝试排除一些路径,但也要确保所有路径模式都不包括我们想要排除的路径:
COPY["文件夹[^b]*"、"文件*"one_answers"/dstPath"]
此外,您还可以阅读有关本期可用解决方案的更多信息:https://github.com/moby/moby/issues/15771
带排除项的COPY解决方案
我有一个PHP+Node应用程序,包含node_modules
和vendor
目录,并有适当的层缓存。
我想通过将一些文件从复制中排除来排除我的依赖项,但由于DockerCOPY
不支持排除,我采取了不同的方法,将我的依赖关系缓存在不同的层中。
它采取了三个不同步骤的组合:
步骤1
编写在我的构建过程中标记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 ...
步骤2
使用.dockerignore
忽略node_modules
和vendor
目录:
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
需要注意的是:我的vendor
和node_modules
目录与源代码位于同一文件夹中。