docker build openwrt 遇到的小问题

在使用 docker 编译 openwrt 遇到了两个坑,问题不复杂,却折腾了一天。

环境如下

  • Dockerfile 定义编译 openwrt 的编译环境
  • docker-compose.yml 定义变化 openwrt 的运行配置,主要是将代码目录 data 使用 -v 映射到容器中
  • /data 代码存放目录

开发流程就两步:

  1. docker-compose build 编译镜像
  2. docker-compose run openwrt bash 进入编译环境

在前一天执行第二步出错后,发现需要添加新的 lib 库,于是更新 Dockerfile ,在 Dockerfile 中添加了缺失的 lib。然后执行docker-compose build,但是执行这一步却卡死在命令行里。重试了 N 次也没有任何效果。

于是使用 原生的 docker build 来编译镜像

1
2
docker build -t <image name> .

放弃 docker-compose ,使用 docker build 来编译,出现了Sending build context to Docker daemon 的提示。

提示是将编译的上下文发送给守护进程。昨天将 openwrt 的编译相关的源码全部都放到了当前目录的 data 目录下。openwrt 的源码加上 dl 目录的文件,整体超过了 10 个 G。

命令行的提示在发送需要编译的内容给 docker 的守护进程,这里突然意识到 docker 在将这 10 几个 G 的文件发送给 docker 守护进程。这样不死才怪。

查看docker官方文档,其中有关的说明, docker 会将 build 指定的目录下的文件都发送给 docker 的守护进程。 docker 提供了 .dockerignore 文件用来过滤,避免不必要的大文件,敏感文件发送到守护进程。 .dockerignore 文件的用法和 .gitignore 文件用法类似。 官方提示最好每个 docker build 的目录最好都提供一个 .dockerignore 文件。

创建一个 .dockerignore 并将 data 目录添加到文件里。然后重新执行 docker-compose build。 解决了这个问题。

在编译镜像过程中,还出现了另外的一个问题。由于 mac 上的空间不够,在 docker 的设置里执行 Move disk image 将 Docker.raw文件挪到扩展卡上,我记得扩展卡剩余空间有 70G 左右。但是在执行的时候总是失败。尝试了几次之后。开始怀疑 docker 在 mac 上有问题。询问同事,都表示没出现过。

用 ncdu 查看扩展卡的硬盘容量占用。 发现硬盘容量剩余 1G 左右。文件夹.Spotlight-V100 占用 48G。文件夹是 Spotlight的索引文件。 这个可能是昨天在编译 openwrt 时,mac 创建索引出现了一些问题导致的。 删除这个索引目录后,硬盘空间又回来了。从新’Move disk image’,执行成功。

在编译 openwrt 时,硬盘占用确实是个大问题,以前使用 vagrant 虚拟机作为编译开发环境,一个 box 编译多次后体积可能会超过30G ,虚拟机的硬盘扩容还麻烦,使用 docker 作为开发编译环境,随用随起,方便不少。

docker build openwrt 遇到的小问题

https://beixiu.net/dev/docker-buil/

作者

张巍

发布于

2019-01-04

更新于

2019-01-04

许可协议

评论