具体参考:godror https://godror.github.io/godror
Godror 是一个 database/sql/driver 的包。用于连接到 Oracle DB 的驱动程序,使用 Anthony Tuininga 出色的 OCI 包装器 ODPI-C。
CGO_ENABLED=1
尽管编译不需要 Oracle 客户端库,但在_运行时需要它们_。从 https://www.oracle.com/database/technologies/instant-client/downloads.html 下载免费的 Basic 或 Basic Light 软件包。
根据之前的文章和参考官网的信息,要运行 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
的依赖需求。
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
普通Dockerfile
FROM 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 .
使用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 .
Godror是用于连接Oracle数据库的Go语言驱动程序,依赖于ODPI-C。构建Godror应用需要Go 1.15+和C编译器,且需设置CGO_ENABLED=1
。运行时则需要Oracle客户端库,可通过Oracle Instant Client Basic或Basic Light包获取。
在构建Docker镜像时,为了适应Debian环境,需将Oracle Instant Client的RPM包转换为DEB包或使用alien
工具安装。文中提供了两种Dockerfile示例:一种是构建带有gcc的Debian镜像,用于编译Go程序;另一种是构建运行时镜像,安装Oracle Instant Client和依赖库libaio1
,并优化了deb文件的安装方式以减小镜像体积。
对于Go项目的Dockerfile,采用多阶段构建,先在包含gcc的builder镜像中编译程序,再将编译结果复制到精简的运行时镜像中,同时利用缓存加速构建过程,最终生成轻量且高效的Docker镜像。