godror简介
具体参考:[godror](https://godror.github.io/godror/)Godror 是一个 database/sql/driver 的包。用于连接到 Oracle DB 的驱动程序,使用 Anthony Tuininga 出色的 OCI 包装器 ODPI-C。
构建时要求
+ Go 1.15+ + C 编译器 - 所以交叉编译很困难,编译时需要开启 `CGO_ENABLED=1`运行时要求
+ Oracle 客户端库 — 请参阅 [ODPI-C](https://oracle.github.io/odpi/doc/installation.html)尽管编译不需要 Oracle 客户端库,但在_运行时需要它们_。从 https://www.oracle.com/database/technologies/instant-client/downloads.html 下载免费的 Basic 或 Basic Light 软件包。
制作Docker镜像
根据之前的文章和参考官网的信息,要运行 `godror`,还需要安装 `oracle-instantclient19.25-basic-19.25.0.0.0-1.x86_64.rpm`。由于官方只提供 RPM 安装包,而 RPM 通常用于 CentOS 系统,我们这里使用的是 Debian 基础镜像。需要注意的是,CentOS 的基础镜像大约有 200 多 MB,而我们希望在更轻量的 Debian 环境中运行程序。为了在 Debian 系统上使用 Oracle Instant Client,我们可以通过转换 RPM 包为 DEB 包的方式来实现,或者使用 alien
工具进行安装。这样可以在保持轻量级环境的同时,满足 godror
的依赖需求。
制作带gcc的debian运行镜像
`vim Dockerfile`FROM debian:golang:1.23-bookworm
# 安装编译需要的环境gcc等
RUN apt update -y && apt install -y gcc
打包为带gcc的debian,避免每次安装gcc环境 docker build -t cgo-debain:1.23 .
如需要可导出为tar包 docker save -o debian-gcc.tar cgo-debain:1.23
压缩一下,节省空间gzip debian-gcc.tar
制作go程序运行基础镜像
普通DockerfileFROM debian:bookworm
# 安装oracle客户端
COPY ./oracle-instantclient19.25-basic_19.25.0.0.0-2_amd64.deb /
RUN dpkg -i /oracle-instantclient19.25-basic_19.25.0.0.0-2_amd64.deb
# 更新软件源并安装 libaio
RUN apt-get update && \
apt-get install -y libaio1 && \
# apt-get install -y gcc && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
项目Dockerfile
优化,主要优化点在于oracle deb文件使用缓存模式安装,通过该方式打包后的Docker没有deb安装包、体积更小。同时避免每次拷贝和安装libaio1
,减少镜像构建时间。
FROM debian:bookworm
# 安装 Oracle Instant Client
RUN --mount=type=bind,source=./build/docker/oracle-instantclient19.25-basic_19.25.0.0.0-2_amd64.deb,target=/oracle-instantclient19.25-basic_19.25.0.0.0-2_amd64.deb \
dpkg -i /oracle-instantclient19.25-basic_19.25.0.0.0-2_amd64.deb &&\
apt-get update && \
apt-get install -y libaio1 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# docker build -t debain-dbes:bookworm .
打包基础镜像:
docker build -t debain-dbes:bookworm -f ./build/docker/Dockerfile-base-debian .
项目Dockerfile
使用oracle的go项目打包,需要设置`CGO_ENABLED=1`# 多阶段构建
#构建一个 builder 镜像,目的是在其中编译出可执行文件gaf
FROM cgo-debain:1.23 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=1 \
&& go mod tidy \
&& go build -ldflags="-s -w" -o gaf /build/src/cmd/gaf/main.go
FROM debain-base:bookworm
COPY --from=builder /build/src/gaf /home/gaf
WORKDIR /home
CMD ["./gaf"]
EXPOSE 9680
# docker build -t dbes-backend:v1.1 -f .\build\docker\Dockerfile-debian .
项目Dockerfile优化,使用缓存加速,打包更迅速
# 多阶段构建
#构建一个 builder 镜像,目的是在其中编译出可执行文件gaf
FROM cgo-debain:1.23 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=1 GOOS=linux go build -ldflags="-s -w" -o /bin/gaf ./cmd/gaf/main.go
FROM debain-dbes:bookworm
COPY --from=builder /bin/gaf /home/gaf
WORKDIR /home
CMD ["./gaf"]
EXPOSE 9680
# docker build -t dbes-backend:v1.1 -f .\build\docker\Dockerfile-debian .
评论区