SONIC添加国内源加速构建Dockerfile镜像

本文介绍如何通过更换国内阿里云源加速微软开源项目SONIC的编译过程,特别是针对Dockerfile中大量软件包的下载,有效缩短了国内环境下整体工程的编译时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. SONIC是微软开源的关于白盒交换机的网络系统项目,详细说明信息可以查看SONIC官网

  2. 由于SONIC是国外的开源项目,使用到Docker技术构建编译镜像sonic-slave和所有的应用程序都使用Docker构建,通过容器运行在设备上;由于国内编译整个SONIC工程时间过于长,记录一些可以加速的方式;

  3. 构建速度低最主要是因为在Dockerfile中的大量软件包的下载,而使用的又是国外的软件源,通过修改源达到加速的效果;

  4. 修改sonic-buildimage/sonic-slave/Dockerfile,注释掉原有的源,更换国内阿里云源;

#RUN sed -i '/deb http:\/\/mirrors.aliyun.com\/debian jessie-updates main/d' /etc/apt/sources.list

#RUN echo "deb http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free" >> /etc/apt/sources.list && \
#RUN echo "deb http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free" >> /etc/apt/sources.list && \
#        echo "deb-src http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free" >> /etc/apt/sources.list && \
#        echo "deb http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list && \
#        echo "deb-src http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list

# clean up source.list
RUN echo "" > /etc/apt/sources.list
# Add aliyun apt source
RUN echo "deb http://mirrors.aliyun.com/debian/ jessie main contrib non-free" >> /etc/apt/sources.list && \
        echo "deb-src http://mirrors.aliyun.com/debian/ jessie main contrib non-free" >> /etc/apt/sources.list && \
        echo "deb http://mirrors.aliyun.com/debian-security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list && \
        echo "deb-src http://mirrors.aliyun.com/debian-security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list && \
        # Add aliyun docer-ce source
        echo "deb https://mirrors.aliyun.com/docker-ce/linux/debian jessie stable " >> /etc/apt/sources.lista
# Add aliyun pip source
RUN mkdir ~/.pip && echo "[global]" >  ~/.pip/pip.conf && \
                    echo "index-url = http://mirrors.aliyun.com/pypi/simple" >>  ~/.pip/pip.conf && \
                    echo "trusted-host = mirrors.aliyun.com"  >>  ~/.pip/pip.conf && \
                    echo "timeout = 600 " >> ~/.pip/pip.conf
  1. 修改sonic-buildimage/sonic-slave-stretch/Dockerfile,同第四步

  2. 其他的应用程序构建Dockerfile也可以作类似的处理,如果依靠安装apt install、pip install或者docker.download.com比较多的,则可以考虑修改;

<think>好的,我现在需要解决用户关于在编译sonic-buildimage时EXTRA_DOCKER_TARGETS参数未生效的问题。用户提到在使用make all编译BUSTER镜像时,虽然设置了EXTRA_DOCKER_TARGETS为all,但BUSTER_DOCKER_IMAGES为空,导致没有实际构建。首先,我需要理解整个编译过程和涉及的变量之间的关系。 首先,根据用户提供的引用信息,sonic在编译过程中会构建一个名为sonic-slave的容器,用于后续的编译工作。编译容器生成Dockerfile,这可能涉及到Docker镜像构建的目标和参数传递[^1]。这可能意味着EXTRA_DOCKER_TARGETS参数在Docker构建过程中被使用,但可能没有被正确传递或处理。 接下来,我需要查看sonic-buildimage项目的Makefile和相关配置文件,了解EXTRA_DOCKER_TARGETS和BUSTER_DOCKER_IMAGES的定义和依赖关系。通常,Makefile中的变量可能通过条件语句或包含其他文件来设置。例如,BUSTER_DOCKER_IMAGES可能在特定条件下才会被赋值,或者依赖于其他变量是否被正确设置。 可能的原因有几个: 1. **变量作用域问题**:在Makefile中,变量可能在某个特定的target或条件下被设置,而用户设置的EXTRA_DOCKER_TARGETS可能没有被正确传递到需要的地方。比如,可能在构建BUSTER镜像时,没有正确继承或覆盖全局的EXTRA_DOCKER_TARGETS。 2. **条件判断错误**:Makefile可能根据不同的目标系统(如Buster、Bullseye等)设置不同的变量。可能BUSTER_DOCKER_IMAGES的设置依赖于某些条件,而这些条件未被满足,导致变量为空。例如,可能需要设置特定的环境变量或命令行参数才能激活BUSTER相关的构建目标。 3. **参数传递问题**:用户可能在执行make命令时,参数传递方式不正确。例如,是否应该使用`EXTRA_DOCKER_TARGETS=all`作为环境变量传递给make,或者在Makefile中有其他方式指定该参数。 4. **目标依赖关系**:可能all目标在构建时没有正确依赖BUSTER_DOCKER_IMAGES相关的目标,或者构建流程中某些步骤被跳过,导致镜像未被生成。 接下来,我需要考虑如何验证这些可能性。例如,检查Makefile中EXTRA_DOCKER_TARGETS的使用位置,查看是否在构建BUSTER镜像时被正确引用。同时,查看BUSTER_DOCKER_IMAGES的定义,确认其赋值是否依赖于EXTRA_DOCKER_TARGETS或其他变量。 可能的解决步骤包括: - 检查Makefile中BUSTER_DOCKER_IMAGES的定义,确认是否在设置EXTRA_DOCKER_TARGETS为all时,该变量被正确填充。 - 确认在调用make时是否指定了正确的目标,例如是否应该使用`make BUSTER`或其他目标来触发BUSTER镜像构建- 查看构建日志,确认是否有错误或警告信息提示EXTRA_DOCKER_TARGETS未被识别或处理。 - 尝试显式设置BUSTER_DOCKER_IMAGES的值,覆盖默认的空值,看是否能触发构建。 另外,可能需要参考项目的文档或社区讨论,看看是否有其他用户遇到类似的问题,并找到解决方案。例如,是否需要在配置文件中启用某些选项,或者是否存在已知的bug需要修复。 最后,综合以上分析,给出用户具体的排查步骤和建议,帮助他们定位问题原因,并解决EXTRA_DOCKER_TARGETS未生效的问题。</think>在`sonic-buildimage`编译过程中,`EXTRA_DOCKER_TARGETS`未生效通常与**变量作用域冲突**或**目标依赖逻辑缺失**有关。以下是具体分析及解决方案: --- ### **逐步排查与解决** 1. **检查Makefile变量继承关系** `BUSTER_DOCKER_IMAGES`是否在`buster.mk`或主Makefile中被正确定义? - 确认`BUSTER_DOCKER_IMAGES`是否通过`$(eval $(call add_extra_image_targets,BUSTER))`动态生成[^1]。 - 若该变量为空,可能是`add_extra_image_targets`宏未正确解析`EXTRA_DOCKER_TARGETS`的值。 2. **参数传递方式验证** 尝试**显式传递参数**而非依赖默认值: ```bash make all EXTRA_DOCKER_TARGETS=all BUSTER=yes ``` 部分版本中,`BUSTER`目标需手动激活[^1]。 3. **查看构建日志定位变量赋值** 添加`DEBUG=1`参数输出详细日志: ```bash make all DEBUG=1 2>&1 | grep "BUSTER_DOCKER_IMAGES" ``` 观察该变量是否在日志中被正确赋值。 4. **检查目标依赖逻辑** 在`buster.mk`中,`BUSTER_DOCKER_IMAGES`可能依赖于`SONIC_BUILD_IMAGE_DEBS`等前置条件。若依赖未满足,变量会被置空。 使用`make list`查看所有有效目标,确认`EXTRA_DOCKER_TARGETS`包含的目标是否在列。 --- ### **典型解决方案** ```bash # 方案1:强制激活BUSTER镜像构建逻辑 make all BUSTER=yes EXTRA_DOCKER_TARGETS=all # 方案2:覆盖空变量(需修改Makefile) # 在buster.mk中添加BUSTER_DOCKER_IMAGES := $(addprefix $(TARGET_PATH)/, $(EXTRA_DOCKER_TARGETS)) ``` --- ### **根本原因分析** 1. **变量覆盖问题** `EXTRA_DOCKER_TARGETS`可能在`buster.mk`中被局部重置为默认值,导致全局赋值失效。 2. **动态生成逻辑缺陷** `add_extra_image_targets`宏可能未正确处理`all`参数,需检查宏定义中是否包含`all`目标的映射。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值