Skip to content

Commit 41f08f7

Browse files
refactor: build the PostgreSQL stage inside the runtime base
1 parent 17634f5 commit 41f08f7

5 files changed

Lines changed: 40 additions & 76 deletions

File tree

‎.github/workflows/build_base_and_push.yml‎

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,19 @@ jobs:
4444
ref: ${{ github.ref_name }}
4545
- name: Prepare
4646
id: prepare
47-
env:
48-
DOCKER_IMAGE: ${{ secrets.ALIYUN_REGISTRY_HOST }}/dataease/sqlbot-python-pg
49-
TAG_NAME: ${{ inputs.dockerImageTag }}
50-
TAG_NAME_WITH_LATEST: ${{ inputs.dockerImageTagWithLatest }}
5147
run: |
52-
tags="$DOCKER_IMAGE:$TAG_NAME"
53-
if [[ "$TAG_NAME_WITH_LATEST" == 'true' ]]; then
54-
tags="$tags,$DOCKER_IMAGE:${TAG_NAME%%.*},$DOCKER_IMAGE:latest"
48+
DOCKER_IMAGE=${{ secrets.ALIYUN_REGISTRY_HOST }}/dataease/sqlbot-python-pg
49+
DOCKER_PLATFORMS=${{ github.event.inputs.architecture }}
50+
TAG_NAME=${{ github.event.inputs.dockerImageTag }}
51+
TAG_NAME_WITH_LATEST=${{ github.event.inputs.dockerImageTagWithLatest }}
52+
if [[ ${TAG_NAME_WITH_LATEST} == 'true' ]]; then
53+
DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME} --tag ${DOCKER_IMAGE}:${TAG_NAME%%.*} --tag ${DOCKER_IMAGE}:latest"
54+
else
55+
DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME}"
5556
fi
56-
echo "tags=$tags" >> "$GITHUB_OUTPUT"
57+
echo ::set-output name=buildx_args::--platform ${DOCKER_PLATFORMS} --memory-swap -1 \
58+
--build-arg DOCKER_IMAGE_TAG=${{ github.event.inputs.dockerImageTag }} --build-arg BUILD_AT=$(TZ=Asia/Shanghai date +'%Y-%m-%dT%H:%M') --build-arg GITHUB_COMMIT=`git rev-parse --short HEAD` --no-cache \
59+
${DOCKER_IMAGE_TAGS} .
5760
- name: Set up QEMU
5861
uses: docker/setup-qemu-action@v3
5962
- name: Set up Docker Buildx
@@ -65,12 +68,8 @@ jobs:
6568
username: ${{ secrets.ALIYUN_REGISTRY_USERNAME }}
6669
password: ${{ secrets.ALIYUN_REGISTRY_PASSWORD }}
6770
- name: Docker Buildx (build-and-push)
68-
env:
69-
SQLBOT_BASE_TAGS: ${{ steps.prepare.outputs.tags }}
70-
SQLBOT_BASE_PLATFORMS: ${{ inputs.architecture }}
7171
run: |
72-
docker buildx bake -f docker-bake.hcl --pull --no-cache --provenance=false --sbom=false \
73-
--set 'base.output=type=image,push=true,oci-mediatypes=false' base
72+
docker buildx build --pull -f Dockerfile-base --output "type=image,push=true,oci-mediatypes=false" --provenance=false --sbom=false ${{ steps.prepare.outputs.buildx_args }}
7473
7574
build-and-push-to-dockerhub:
7675
if: ${{ contains(github.event.inputs.registry, 'dockerhub') }}
@@ -82,16 +81,19 @@ jobs:
8281
ref: ${{ github.ref_name }}
8382
- name: Prepare
8483
id: prepare
85-
env:
86-
DOCKER_IMAGE: dataease/sqlbot-python-pg
87-
TAG_NAME: ${{ inputs.dockerImageTag }}
88-
TAG_NAME_WITH_LATEST: ${{ inputs.dockerImageTagWithLatest }}
8984
run: |
90-
tags="$DOCKER_IMAGE:$TAG_NAME"
91-
if [[ "$TAG_NAME_WITH_LATEST" == 'true' ]]; then
92-
tags="$tags,$DOCKER_IMAGE:${TAG_NAME%%.*},$DOCKER_IMAGE:latest"
85+
DOCKER_IMAGE=dataease/sqlbot-python-pg
86+
DOCKER_PLATFORMS=${{ github.event.inputs.architecture }}
87+
TAG_NAME=${{ github.event.inputs.dockerImageTag }}
88+
TAG_NAME_WITH_LATEST=${{ github.event.inputs.dockerImageTagWithLatest }}
89+
if [[ ${TAG_NAME_WITH_LATEST} == 'true' ]]; then
90+
DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME} --tag ${DOCKER_IMAGE}:${TAG_NAME%%.*} --tag ${DOCKER_IMAGE}:latest"
91+
else
92+
DOCKER_IMAGE_TAGS="--tag ${DOCKER_IMAGE}:${TAG_NAME}"
9393
fi
94-
echo "tags=$tags" >> "$GITHUB_OUTPUT"
94+
echo ::set-output name=buildx_args::--platform ${DOCKER_PLATFORMS} --memory-swap -1 \
95+
--build-arg DOCKER_IMAGE_TAG=${{ github.event.inputs.dockerImageTag }} --build-arg BUILD_AT=$(TZ=Asia/Shanghai date +'%Y-%m-%dT%H:%M') --build-arg GITHUB_COMMIT=`git rev-parse --short HEAD` --no-cache \
96+
${DOCKER_IMAGE_TAGS} .
9597
- name: Set up QEMU
9698
uses: docker/setup-qemu-action@v3
9799
- name: Set up Docker Buildx
@@ -102,9 +104,5 @@ jobs:
102104
username: ${{ secrets.DOCKERHUB_USERNAME }}
103105
password: ${{ secrets.DOCKERHUB_TOKEN }}
104106
- name: Docker Buildx (build-and-push)
105-
env:
106-
SQLBOT_BASE_TAGS: ${{ steps.prepare.outputs.tags }}
107-
SQLBOT_BASE_PLATFORMS: ${{ inputs.architecture }}
108107
run: |
109-
docker buildx bake -f docker-bake.hcl --pull --no-cache --provenance=false --sbom=false \
110-
--set 'base.output=type=image,push=true,oci-mediatypes=false' base
108+
docker buildx build --pull -f Dockerfile-base --output "type=image,push=true,oci-mediatypes=false" --provenance=false --sbom=false ${{ steps.prepare.outputs.buildx_args }}

‎Dockerfile-base‎

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
11
# syntax=docker/dockerfile:1
22
ARG PYTHON_IMAGE=python:3.11-slim-bookworm
33
ARG NODE_IMAGE=node:22-bookworm-slim
4-
ARG SQLBOT_PG_BASE_IMAGE=pg-base
4+
ARG POSTGRES_IMAGE=postgres:17-bookworm
5+
6+
FROM ${POSTGRES_IMAGE} AS pg-base
7+
# Upgrade inherited system packages once and retain the PostgreSQL 17 data directory.
8+
RUN apt-get -o APT::Update::Error-Mode=any update \
9+
&& DEBIAN_FRONTEND=noninteractive apt-get -y --no-remove dist-upgrade \
10+
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends postgresql-17-pgvector \
11+
&& rm -rf /var/lib/apt/lists/* \
12+
&& test "$PG_MAJOR" = 17 \
13+
&& test "$PGDATA" = /var/lib/postgresql/data \
14+
&& test -f "$(pg_config --sharedir)/extension/vector.control"
515

616
FROM ${PYTHON_IMAGE} AS python-builder
717
ARG PIP_VERSION=26.3
@@ -20,7 +30,7 @@ RUN set -eu; \
2030

2131
FROM ${NODE_IMAGE} AS node-runtime
2232

23-
FROM ${SQLBOT_PG_BASE_IMAGE} AS graphics-toolchain
33+
FROM pg-base AS graphics-builder
2434
# Build from the signed Bookworm source index in a disposable stage.
2535
RUN sed 's/^Types: deb$/Types: deb-src/' /etc/apt/sources.list.d/debian.sources \
2636
> /etc/apt/sources.list.d/sqlbot-src.sources \
@@ -29,11 +39,10 @@ RUN sed 's/^Types: deb$/Types: deb-src/' /etc/apt/sources.list.d/debian.sources
2939
build-essential ca-certificates curl dpkg-dev \
3040
&& DEBIAN_FRONTEND=noninteractive apt-get build-dep -y --no-install-recommends harfbuzz gdk-pixbuf
3141

32-
FROM graphics-toolchain AS graphics-builder
3342
COPY docker/build-graphics.sh /tmp/build-graphics.sh
3443
RUN sh /tmp/build-graphics.sh
3544

36-
FROM ${SQLBOT_PG_BASE_IMAGE}
45+
FROM pg-base
3746

3847
COPY --from=python-builder /usr/local/ /usr/local/
3948
COPY --from=node-runtime /usr/local/bin/node /usr/local/bin/node

‎Dockerfile-pg-base‎

Lines changed: 0 additions & 12 deletions
This file was deleted.

‎docker-bake.hcl‎

Lines changed: 0 additions & 31 deletions
This file was deleted.

‎docs/agents/packaging.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
1. 前端构建:在 Node 22 Bookworm 镜像中对 `frontend/` 执行 `npm install` 和 `npm run build`,产物进入 `/opt/sqlbot/frontend/dist`。
88
2. 后端构建:从运行基础镜像派生编译层,使用 uv 同时解析应用依赖和镜像专用安全约束,构建 PostgreSQL 和 SQL Server 驱动,使其链接运行层系统库。`uv.lock` 不入库,构建会重新解析依赖。
99
3. 图表服务构建:复制 `g2-ssr/app.js`、`package.json` 和 `charts/`,从源码构建 canvas,使其使用运行层的 Debian 图形库。编译层和运行层使用相同的 Node 主版本和 Debian 发行版。
10-
4. 运行层:`Dockerfile-pg-base` 基于 PostgreSQL 17 Bookworm 安装系统安全更新和 pgvector。`Dockerfile-base` 在此基础上加入 Python、Node、Oracle 客户端及许可证校验器。图形库从 Bookworm 源码包构建,HarfBuzz 应用 CVE-2023-25193 上游补丁,GDK Pixbuf 禁用未使用的 TIFF 加载器。应用镜像复制前端、后端、g2-ssr、字体、向量模型和启动脚本,并使用 dmPython wheel 提供的达梦客户端库。
10+
4. 运行层:`Dockerfile-base` 的 `pg-base` 阶段基于 PostgreSQL 17 Bookworm 统一更新继承的 Debian 系统包并安装 pgvector。后续阶段只安装本层所需依赖,加入 Python、Node、Oracle 客户端及许可证校验器。图形库从 Bookworm 源码包构建,HarfBuzz 应用 CVE-2023-25193 上游补丁,GDK Pixbuf 禁用未使用的 TIFF 加载器。应用镜像复制前端、后端、g2-ssr、字体、向量模型和启动脚本,并使用 dmPython wheel 提供的达梦客户端库。
1111
5. 启动脚本依次准备 PostgreSQL、supervisor/g2-ssr、MCP 服务和主 FastAPI 服务。
1212

1313
修改路径、端口、依赖或构建脚本时,必须核对最终运行目录仍是 `/opt/sqlbot` 布局,且数据、图片、日志和字体路径没有断开。
@@ -56,9 +56,9 @@ node --check g2-ssr/charts/<changed-file.js>
5656

5757
规则:
5858

59-
- `build-base-and-push` 通过 `docker-bake.hcl` 先构建 PostgreSQL 层,再产出 `sqlbot-python-pg` 基础镜像。PostgreSQL 中间镜像只在构建图中使用。
59+
- `build-base-and-push` 使用 `docker buildx build -f Dockerfile-base` 构建 `sqlbot-python-pg`。构建时刷新上游镜像,PostgreSQL 阶段随同一次构建完成。
6060
- 构建应用镜像时,通过 `SQLBOT_RUNTIME_IMAGE` 传入已验证的基础镜像标签或 digest。`build-and-push` 的 `runtimeBaseImage` 输入支持此覆盖。默认使用阿里云 `latest`。
61-
- 本地执行 `docker buildx bake -f docker-bake.hcl --load app` 可按顺序构建三层。单独验证基础镜像时,将目标改为 `base`。
61+
- 本地执行 `docker buildx build -f Dockerfile-base --load -t sqlbot-python-pg:local .` 构建基础镜像。构建应用镜像时,用 `--build-arg SQLBOT_RUNTIME_IMAGE` 传入当前构建器可访问的基础镜像标签或摘要。单独验证 PostgreSQL 阶段时使用 `--target pg-base`。漏洞复扫以最终应用镜像为准。
6262
- 这些工作流都是发布/分发流程,不要因为普通代码修改建议运行。
6363
- `latest` 只应在正式发布时启用。
6464
- arm64 和 amd64 的依赖、驱动和包名必须同时考虑。

0 commit comments

Comments
 (0)