OpenShift v3.11下Docker多阶段构建COPY conda目录报错解决方案问询
问题根因
你遇到的报错是OpenShift 3.11默认搭载的Docker 1.13版本的已知缺陷:该版本处理多阶段构建的COPY指令时,无法正确识别来源阶段中存在的硬链接关系,而conda create --clone命令默认会使用硬链接复用相同文件来节省存储空间,因此复制整个conda目录时就会触发硬链接找不到源文件的报错。本地环境的Docker版本较高,已经修复了跨阶段硬链接复制的问题,所以可以正常构建。
可行解决方案
方案1:打包传递conda目录(最推荐,无额外副作用)
修改Dockerfile,在builder阶段将conda目录打包为压缩包后再传递到最终镜像,绕过硬链接处理逻辑:
- 在builder阶段的末尾新增打包命令:
RUN tar -czf /opt/conda_pkg.tar.gz -C /opt/ conda
- 替换原来的COPY指令,改为复制压缩包后解压:
COPY --from=builder /opt/conda_pkg.tar.gz /tmp/ RUN tar -xzf /tmp/conda_pkg.tar.gz -C /home/root/test/ && rm -f /tmp/conda_pkg.tar.gz
方案2:禁用conda硬链接
修改builder阶段的conda配置,禁止克隆环境时使用硬链接,适合可以接受镜像体积变大的场景:
在builder阶段所有conda命令执行前,新增配置项:
RUN conda config --set allow_hardlinks False
修改后原有COPY指令可以直接使用,无需其他调整。
方案3:调整OpenShift构建运行时
如果集群管理员允许修改构建配置,可以将构建策略从默认的Docker构建替换为Buildah构建,Buildah对硬链接的处理兼容性更强,无需修改Dockerfile即可完成构建。
内容的提问来源于stack exchange,提问作者carterlin
相关产品推荐
相关产品推荐

