前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【Golang】全网首发:Oracle数据库godror驱动docker打包,含CGO Dockerfile终极指南

【Golang】全网首发:Oracle数据库godror驱动docker打包,含CGO Dockerfile终极指南

作者头像
编码如写诗
发布2025-02-18 21:05:04
发布2025-02-18 21:05:04
5300
代码可运行
举报
文章被收录于专栏:编码如写诗编码如写诗
运行总次数:0
代码可运行

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

尽管编译不需要 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

代码语言:javascript
代码运行次数:0
复制
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程序运行基础镜像

普通Dockerfile

代码语言:javascript
代码运行次数:0
复制
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,减少镜像构建时间。

代码语言:javascript
代码运行次数:0
复制
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 .

打包基础镜像:

代码语言:javascript
代码运行次数:0
复制
docker build -t debain-dbes:bookworm -f ./build/docker/Dockerfile-base-debian .

项目Dockerfile

使用oracle的go项目打包,需要设置CGO_ENABLED=1

代码语言:javascript
代码运行次数:0
复制
# 多阶段构建
#构建一个 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优化,使用缓存加速,打包更迅速

代码语言:javascript
代码运行次数:0
复制
# 多阶段构建
#构建一个 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镜像。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编码如写诗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • godror简介
  • 构建时要求
  • 运行时要求
  • 制作Docker镜像
    • 制作带gcc的debian运行镜像
    • 制作go程序运行基础镜像
    • 项目Dockerfile
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档