侧边栏壁纸
  • 累计撰写 48 篇文章
  • 累计创建 7 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Docker导出二进制文件和优化

Administrator
2024-09-12 / 0 评论 / 0 点赞 / 11 阅读 / 0 字

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 .

0

评论区