Docker Buildx跨平台构建

前言 拉取使用别人镜像时发现在不同CPU架构下都可以使用,查找后发现虽然是同一个镜像但是分不同的架构版本,拉取镜像时会拉取当前CPU架构下的镜像,所以可以全平台通用一个命令。 比如golang:1.24.1 docker pull golang:1.24.1 可以看到官方镜像是分为好多架构的 Buildx 1、Buildx 简介 Docker Buildx 是 Docker的CLI插件,来自于Moby BuildKit 。自从Docker 18.06 开始这个插件直接集成到了Docker build 中。 Buildx 是一个构建工具, 它可以帮助用户快速、高效地构建 Docker 镜像, 并支持多种平台的构建。使用 buildx, 用户可以在单个命令中构建多种架构的镜像, 例如 x86 和 ARM 架构, 而无需手动操作多个构建命令。此外, buildx 还支持 Dockerfile 的多阶段构建和缓存, 这可以大大提高镜像构建的效率和速度。 2、Buildx 安装 注意: 在Debian和Ubuntu中不要使用apt install docker.io命令安装docker,因为docker.io不是官方docker,没有内置buildx,所以安装后无法使用buildx,应该使用官方镜像安装docker才内置buildx。 debian/ubuntu官方教程:https://docs.docker.com/engine/install/debian/ 添加密钥 sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update 安装docker-ce和插件 ...

2025-03-31 · 3 分钟 · 593 字 · Javaow

Dockerfile多阶段构建

前言 之前使用dockerfile构建镜像时,都是使用单个dockerfile构建,把构建好的二进制或jar包导出重写打包为镜像,这样比较麻烦无法自动化, 从其他地方了解到可以使用多阶段构建,跟GitHub的Action类似,方便快捷。 1.使用 在Dockerfile的多阶段构建中,最终生成的镜像是以最后一个阶段的镜像为准的 每个阶段都是一个FROM,以FROM为标识多个阶段 # 第一阶段:编译 # 必须用AS定义一个自定义别名 在其他阶段要使用 FROM golang:1.18 AS builder # 设置工作目录(创建并cd过去) WORKDIR /app # 从宿主机复制main.go到容器当前目录(/app/main.go) COPY main.go . # 执行编译命令 RUN go build -o myapp /app/main.go # 第二阶段:生成最终镜像 FROM alpine:latest # 设置工作目录(创建并cd过去) WORKDIR /root/ # 从第一阶段复制文件到第二阶段中 # --from 指定把builder阶段中的/app/myapp文件复制到当前镜像当前目录中(/root/myapp) COPY --from=builder /app/myapp . # 启动命令 CMD ["./myapp"] 2.构建go镜像 1.简单的go单文件 package main import ( "fmt" ) func main() { fmt.Println("我是多阶段构建出来的镜像") } 2.dockerfile # 第一阶段:编译 # 必须用AS定义一个自定义别名 在其他阶段要使用 FROM golang:1.20 AS builder # 设置工作目录(创建并cd过去) WORKDIR /apps # 从宿主机复制main.go到容器当前目录(/apps/main.go) COPY main.go . # 设置 Go 环境变量 切换模块源为中国Go模块代理服务器 RUN go env -w GOPROXY=https://goproxy.cn,direct # 在当前目录初始化创建main模块并自动解析下载依赖(构建完整模块 tidy完善go.mod) RUN go mod init main && go mod tidy # 执行编译命令 编译好的二进制是/apps/main RUN go build -o /apps/main /apps/main.go # 第二阶段:生成最终镜像 FROM alpine:latest # 设置工作目录(创建并cd过去) WORKDIR /root/ # 从第一阶段复制文件到第二阶段中 # --from 指定把builder阶段中的/app/myapp文件复制到当前镜像当前目录中(/root/main) COPY --from=builder /apps/main . # 设置时区为上海,并且创建全局访问的软链接 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo 'Asia/Shanghai' > /etc/timezone \ && ln -s /root/main /usr/bin/main # 设置编码 ENV LANG C.UTF-8 # 创建软链接 解决二进制无法执行问题 amd架构必须执行 # RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 # 运行golang程序的命令 CMD main 3.构建镜像 docker build -f dockerfile -t g1 . 打包出来的镜像只有9m,符合alpine镜像大小 ...

2025-03-31 · 1 分钟 · 189 字 · Javaow