Go应用Dockerfile编辑
# 一、概述
我们知道使用GO开发的应用程序,我们可以打包成二进制文件,然后直接像shell
脚本一样执行即可。因此基于此方式,我们在编辑go项目的Dockerfile时,可以借助多层构建的功能,使最终的镜像体积很小,但是也不影响业务的运行。
# 二、GO应用打包介绍
# 2.1 直接打包
在项目根目录执行,这将在当前目录下生成一个名为应用程序module
的可执行文件。
go build
1
# 2.2 指定输出文件名
我们如果想要指定打包后的脚本名称,则可以使用-o
参数指定,指定打包后的项目脚本问app
go build -o app
1
# 2.3 交叉编译
Go交叉编译允许你在一个平台上构建适用于其他操作系统和架构的Go可执行文件。这对于在本地构建不同操作系统或架构的二进制文件非常有用。
- 在 Windows 上构建 Linux 二进制文件
# 设置变量
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
# 打包
go build -o app.exe
1
2
3
4
5
6
2
3
4
5
6
- 在Linux上构建Windows可执行文件
# 设置变量
GOOS=windows
GOARCH=amd64
# 打包
go build -o app.exe
1
2
3
4
5
2
3
4
5
- 在MacOS上构建Windows可执行文件
# 设置变量
GOOS=windows
GOARCH=amd64
# 打包
go build -o app.exe
1
2
3
4
5
2
3
4
5
# 三、Docker镜像
使用Dockerfile
将Go项目打包为Docker镜像。可以使用多层构建的方式,将Go应用程序编译并放入最终的镜像中。
- Dockerfile示例
FROM golang:1.20 as builder
WORKDIR /apps
COPY ./ /apps
RUN export GOPROXY=https://goproxy.cn \
&& go build -ldflags "-s -w" -o get-pod \
&& chmod +x get-pod
FROM alpine
LABEL maintainer="tchua"
COPY /apps/get-pod /apps/
RUN echo -e "http://mirrors.aliyun.com/alpine/v3.15/main\nhttp://mirrors.aliyun.com/alpine/v3.15/community" > /etc/apk/repositories \
&& apk update && apk --no-cache add tzdata gcompat libc6-compat \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Shanghai/Asia" > /etc/timezone \
&& apk del tzdata \
&& ln -s /lib/libc.so.6 /usr/lib/libresolv.so.2
WORKDIR /apps
CMD ["./get-pod"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
说明
上面Dockerfile
我们使用了多层构建的方式:
FROM golang:1.20 as builder
阶段一,注意负责应用的依赖下载及打包export GOPROXY=https://goproxy.cn
设置代理,加上GO依赖下载go build -ldflags "-s -w"
指定链接标志以减小打包后可执行文件的大小
FROM alpine
阶段二,核心配置COPY --from=builde
从阶段1中复制构建好的应用程序到当前阶段libc6-compat 包
提供了对glibc的兼容支持,可以使用glibc编译的应用程序能够在这些系统上正常运行
Alpine是一个基于musl libc和BusyBox的轻量级Linux发行版相比于传统的GNU C库(glibc),musl libc是另一个C库的实现,它旨在提供更小巧、更快速的运行时环境。
- 查看构建后镜像大小
可以看到镜像只有不到50M,如果使用原始GO镜像,则会达到上G的大小
编辑 (opens new window)
上次更新: 2023/06/30, 17:27:04