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

目 录CONTENT

文章目录

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

Administrator
2025-02-17 / 0 评论 / 0 点赞 / 4 阅读 / 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](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程序运行基础镜像

普通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 .

项目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 .

0

评论区