https://docs.docker.com/build/guide/export/
要将构建结果导出为文件,您可以使用local
导出器。local
导出器会将构建容器的文件系统保存到主机上的指定目录中。
要使用local
导出器,请将--output
选项传递给docker build
命令。该--output
标志带有一个参数:主机上要保存文件的目标位置。
以下命令将server
目标中的文件导出到主机文件系统上的当前工作目录:
$ docker build --output=. --target=server .
运行此命令会在 处创建一个二进制文件./bin/server
。它创建在 bin/
目录下,因为该文件位于构建容器内。
$ ls -l ./bin
total 14576
-rwxr-xr-x 1 user user 7459368 Apr 6 09:27 server
Dockerfile中可添加一个阶段如下:
FROM scratch AS server
COPY --from=build-server /bin/server /bin/
完整操作如下:
Dockerfile 添加如下代码
- arm版本打包
FROM --platform=linux/arm64 golang23:zf as builder
#将上层整个文件夹拷贝到/build
ADD . /build/src
WORKDIR /build/src
#去掉了调试信息 -ldflags="-s -w" 以减小镜像尺寸
RUN go env -w GOPROXY=https://goproxy.cn,direct && go build -ldflags="-s -w" -o ipm ./cmd/publish/main.go
FROM scratch AS binaries
COPY --from=builder /build/src/ipm /
执行构建
docker build --output=./test --target=binaries .
此时宿主机当前目录的test下出现ipm二进制文件,实现arm版本打包
- mipse64打包
拉取mipse版golang镜像
docker pull golang:1.23.0 --platform=linux/mips64le
修改Dockerfile
FROM --platform=linux/mips64le golang:1.23.0 as builder
#将上层整个文件夹拷贝到/build
ADD . /build/src
WORKDIR /build/src
#去掉了调试信息 -ldflags="-s -w" 以减小镜像尺寸
RUN go build -ldflags="-s -w" -o ipm ./cmd/publish/main.go
FROM scratch AS binaries
COPY --from=builder /build/src/ipm /
执行构建
docker build --output=./test --target=binaries .
验证
root@DESKTOP-BB0KRFQ:/mnt/d/projects/csmp/ipm# file ./test/ipm
./test/ipm: ELF 64-bit LSB executable, MIPS, MIPS64 rel2 version 1 (SYSV), dynamically linked, interpreter /lib64/ld.so.1, BuildID[sha1]=9d8b3a06637b96230a5eb81e2e363d81705ea084, for GNU/Linux 3.2.0, stripped
- loong64
参考:打包多平台架构镜像
完善后的Dockerfile
# syntax=docker/dockerfile:1
ARG PLATFORM=$TARGETPLATFORM
ARG ARCH=$TARGETARCH
ARG ALPINE_VERSION=3.20
ARG GO_VERSION=1.23.0
# 多阶段构建
#构建一个 builder 镜像,目的是在其中编译出可执行文件mck
#构建时需要将此文件放到代码根目录下
FROM --platform=${PLATFORM} golang-${ARCH}-zf:${GO_VERSION}-alpine${ALPINE_VERSION} as builder
#将上层整个文件夹拷贝到/build
ADD . /build/src
WORKDIR /build/src
#去掉了调试信息 -ldflags="-s -w" 以减小镜像尺寸
RUN go env -w GO111MODULE=on \
&& go env -w GOPROXY=https://goproxy.cn,direct \
&& go env -w CGO_ENABLED=0 \
&& go mod tidy \
&& go build -ldflags="-s -w" -o ha /build/src/cmd/ha/main.go
FROM --platform=${PLATFORM} alpine-${ARCH}:${ALPINE_VERSION}
WORKDIR /home
COPY --from=builder /build/src/configs/config.yml /home/configs/config.yml
COPY --from=builder /build/src/ha /home/ha
CMD ["home/ha"]
#EXPOSE 9681
#docker run -d --name ha -p 9680:9680 -v /etc/localtime:/etc/localtime ha
# docker run -d --pid=host --privileged=true -p 9680:9680 -v /etc/sysconfig/network-scripts:/etc/sysconfig/network-scripts -v /etc/localtime:/etc/localtime ha
# 构建arm64镜像:docker build -t ipm-arm:v4.0.0 --platform=linux/arm64 .
# 构建amd64镜像:docker build -t ipm-mips:v4.0.0 --platform=linux/amd64 .
最终优化版
# syntax=docker/dockerfile:1
ARG PLATFORM=$TARGETPLATFORM
ARG ARCH=$TARGETARCH
ARG ALPINE_VERSION=3.20
ARG GO_VERSION=1.23.0
# 多阶段构建
#构建一个 builder 镜像,目的是在其中编译出可执行文件
FROM --platform=${PLATFORM} golang-${ARCH}-zf:${GO_VERSION}-alpine${ALPINE_VERSION} as builder
WORKDIR /build/src
#RUN go env -w GOPROXY=https://goproxy.cn,direct
#使用缓存进行构建,加快构建速度
RUN --mount=type=cache,target=/go/pkg/mod/ \
--mount=type=bind,source=go.sum,target=go.sum \
--mount=type=bind,source=go.mod,target=go.mod \
go mod download -x
RUN --mount=type=cache,target=/go/pkg/mod/ \
--mount=type=bind,target=. \
CGO_ENABLED=0 GOARCH=$ARCH go build -ldflags="-s -w" -o /bin/server ./cmd/ha/main.go
# 构建最终镜像
FROM --platform=${PLATFORM} alpine-${ARCH}:${ALPINE_VERSION} AS final
#COPY ./configs/config.yml /bin/configs/config.yml
COPY --from=builder /bin/server /bin/
EXPOSE 9681
ENTRYPOINT [ "/bin/server" ]
#docker run -d --name ha -p 9680:9680 -v /etc/localtime:/etc/localtime ha
# docker run -d --pid=host --privileged=true -p 9680:9680 -v /etc/sysconfig/network-scripts:/etc/sysconfig/network-scripts -v /etc/localtime:/etc/localtime ha
# 构建arm64镜像:docker build -t test:v1 --platform=linux/arm64 .
# 构建amd64镜像:docker build -t test:v1 --platform=linux/amd64 .
评论区