Docker-ce的bbappend在镜像构建中未生效的问题求助
问题原因
你在docker-ce_git.bbappend中设置的ROOTFS_POSTPROCESS_COMMAND是单个包(docker-ce)的构建后处理变量,仅在构建docker-ce包本身时生效。而最终镜像的ROOTFS_POSTPROCESS_COMMAND属于镜像recipe(my_image.bb)的独立变量,不会自动继承单个包的该变量配置,因此构建完整镜像时函数不会执行。
解决方案
有三种可靠的解决方式,任选其一即可:
方式1:将逻辑添加到镜像recipe中
直接修改你的镜像文件project-spec/meta-user/recipes-core/images/my_image.bb,添加以下代码:
ino_move_docker_data() { echo "{" >> ${IMAGE_ROOTFS}/etc/docker/daemon.json echo ' "data-root": "/data/docker"' >> ${IMAGE_ROOTFS}/etc/docker/daemon.json echo "}" >> ${IMAGE_ROOTFS}/etc/docker/daemon.json } ROOTFS_POSTPROCESS_COMMAND += " ino_move_docker_data;"
修改后执行bitbake -e my_image,即可看到该函数已加入镜像的ROOTFS_POSTPROCESS_COMMAND,重新构建镜像即可生效。
方式2:通过bbappend扩展镜像recipe(推荐不修改原镜像文件时使用)
若不想直接修改my_image.bb,可创建对应的bbappend文件:
- 路径:
project-spec/meta-user/recipes-core/images/my_image.bbappend - 将方式1中的代码复制到这个bbappend文件中即可,效果和修改原镜像文件一致。
方式3:更符合Yocto规范的做法(直接给docker-ce包添加配置文件)
相比用镜像后处理,更推荐直接将daemon.json作为docker-ce包的一部分安装,这样只要任何镜像安装了docker-ce,都会包含该配置:
修改你的docker-ce_git.bbappend,替换原内容为:
do_install_append() { # 创建docker配置目录(如果不存在) mkdir -p ${D}/etc/docker # 生成daemon.json文件 cat > ${D}/etc/docker/daemon.json <<EOF { "data-root": "/data/docker" } EOF } # 声明该文件属于docker-ce包 FILES_${PN} += "/etc/docker/daemon.json"
这种方式无需依赖镜像的后处理逻辑,完全遵循Yocto的包管理机制,更稳定可靠。
内容的提问来源于stack exchange,提问作者David Levy
相关产品推荐
相关产品推荐

