Dockerfile中能否让前置文件归当前层所有以避免跨文件系统重命名?
容器构建Chromium V8时OverlayFS跨层文件移动问题
我正尝试在容器中构建chromium v8,将其作为另一程序构建链的一部分,但其中一款二进制构建工具崩溃了——原因是它试图跨overlayfs为容器层创建的文件系统边界重命名/移动文件。
我已向该构建工具提交了Bug,希望它能妥善处理overlayfs,同时不给Chromium团队增加额外负担,但即便顺利解决也需要很长时间。
目前我有两种临时解决方案,但都不尽人意:
- 将所有涉及相关文件的操作放在同一层执行:但这意味着每次构建都要重新下载多GB的文件,对于使用计量网络的项目维护者来说完全不可行。
- 先将文件复制到临时目录,删除原文件后再移回当前层:这会使磁盘占用翻倍,还会大幅拖慢构建速度。
因此我想知道:是否有办法让Docker或overlayfs移除/忽略部分层之间的边界,或者将前置层中的文件转移到当前层?
示例场景
跨层移动文件(即便是复制后的文件)会触发XDEV错误:
COPY ./some-file ./some-file RUN mv ./some-file ./some-renamed-file
我可以通过在层内复制文件,让文件归当前层所有来规避这个问题:
COPY ./some-file ./some-temporary-file-name RUN cp ./some-temporary-file-name ./the-real-file-name \ && rm ./some-temporary-file-name
但当涉及海量源码目录,且外部程序需要移动的文件具有不确定性(比如文件名包含随机哈希)时,这种方式会变得异常麻烦且资源消耗巨大:
RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git WORKDIR /v8-temp RUN fetch v8 \ && mkdir /v8 # 因为无法预知工具需要移动哪些文件,我不得不复制整个工作目录 WORKDIR /v8 RUN cp -r /v8-temp /v8 \ && rm -rf /v8-temp \ && gclient sync # 如果不通过其他方式清理镜像,还要等待旧源码文件被删除,这会增加构建时间或最终镜像的大小。
内容的提问来源于stack exchange,提问作者joshhemphill
相关产品推荐
相关产品推荐

