[docker] docker buildx - 跨CPU架构构建镜像

docker buildx 使用

  • buildx使用
  • manifest的使用
  • 可能的报错
    • 1. 源镜像非https

buildx使用

  1. qemu
    docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
    
  2. 创建builder
    # 新建一个builder instance, 名字叫arm(--name), 指定支持的平台(--platform), 指定driver(--driver), 使用(--use)
    docker buildx create --name arm --platform linux/arm64,linux/arm,linux/arm/v6,linux/arm/v8,linux/amd64,linux/386 --driver docker-container --use
    # boot并查看
    docker buildx inspect arm --bootstrap
    
    其中:
    • docker buildx create 用于新建builder
      • name: 指定名称
      • platform: 支持架构, 包括arm64、arm、arm/v7等(详见github)
      • driver: 没明白
      • use: 使用这个builder
    • docker buildx inspect 用于查看builder
  3. 构建镜像
    docker buildx build --platform linux/arm64 . -t $(IMG_NAME):$(TAG) -f Dockerfile --load
    
    其中:
    • docker buildx build用于build
      • platform: 为哪些架构build
      • t: tag
      • f: dockerfile文件名
      • load: 将build完的镜像加载到docker(不然只在缓存里,docker images找不到这个镜像)

manifest的使用

可能的报错

1. 源镜像非https

  • 报错

    error: failed to solve: rpc error: 
    	code = Unknown 
    	desc = xxx:xxx/xxxx/xxxx:letest: 
    			failed to do request: Head "https://xxx:xxx/v2/xxxx/xxxx/manifests/latest": 
    			http: server gave HTTP response to HTTPS client
    

    在这里插入图片描述

  • 原因
    拉取镜像时默认去https的仓库,当镜像仓库并非https的时候,就会报以上错误。
    如果是docker pull时候报类似错误,可以通过在/etc/docker/daemon.jsoninsecure-registries后加上需要走http的ip:port,但是buildx使用的是buildkit,所以修改docker的配置对其无效。

  • 解决一:指定配置文件创建builder

  1. 新建~/.config/buildkit/buildkitd.toml或者/etc/buildkit/buildkitd.toml(两者的区别见buildkitd.toml.md),写入以下内容:
    debug = true
    
    # registry configures a new Docker register used for cache import or output.
    [registry."192.168.1.3:1234"]
      http = true
      insecure = true
    
  2. 创建builder
    # 指定配置文件:--config ~/.config/buildkit/buildkitd.toml
    docker buildx create --driver docker-container --platform linux/arm64,linux/amd64 --config ~/.config/buildkit/buildkitd.toml --use
    
  3. 编写dockerfile
    FROM 192.168.1.3:1234/test/test:base
    .....
    
  4. build镜像
    docker buildx build --platform linux/arm64 . -t test:latest  --load
    
  • 解决二:build时添加参数
    没测试成功

  • 参考

  1. Buildx is not honouring the insecure registry config in toml config provided by the default builder.
  2. buildkitd.toml.md

你可能感兴趣的:(#,2021,学习笔记,docker,buildx,http)