我们使用自动程序buildimage镜像,其中过程中发现很多诡异的问题, 有很多尚在解决中, 但是同时buildimage, 高频度的连续buildimage依然有部稳定的情况,特别在超过5G以上的镜像时,发生的概率极高.

我们先说两个问题:

    1. docker build 时间过久,其中绝大部分时间在Sending build context to Docker daemon(dockerfile的编写优化方案,网上很多此处不赘述)

    2. dockerfile add时,不能使用本级目录以外的其他目录及文件.

以上两个问题都是因为一个设计问题影响所致.

根文件

   |

   |-  Dockerfile

   |

   |- 文件夹1

   |- 文件夹2

docker build upload时间过久是因为启动时加载本层级目录所有的文件, 如上述加载根文件的所有文件,包括文件夹1,文件夹2, 如果本级目录文件较多,则加载时间是非常慢,因此build dockerfile时应在一个叶子文件夹中执行build.

相关client源码:

// opts.ContextDir 是 build的文件夹
if opts.ContextDir != "" {
        if opts.InputStream != nil {
            return ErrMultipleContexts
        }
        var err error
        // 加载本级目录,也是影响时间核心问题
        if opts.InputStream, err = createTarStream(opts.ContextDir, opts.Dockerfile); err != nil {
            return err
        }
}

由于流加载是包括本级目录的,故此upload的时间会过长.

docker add时使用也是由此处加载有关, 程序会将本地文件夹拷贝到/var/lib/docker/tmp中,从而在tmp中向容器内部拷贝,故此他时没有办法跨目录的.

tmp

   |

   |-  Dockerfile

   |

   |- 文件夹1

   |- 文件夹2


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐