pgxn/pgxn-tools是一个用于自动化测试PostgreSQL扩展(针对多版本PostgreSQL)并发布到PGXN(PostgreSQL扩展网络)的Docker镜像。基于Debian Bookworm Slim构建,使用PostgreSQL Apt仓库安装PostgreSQL,支持8.2及以上版本(包括最新预发布版)。
镜像包含以下实用工具:
pgxn: PGXN命令行客户端,用于从PGXN安装扩展依赖pg_prove: 运行pgTAP测试的工具pg-start: 安装指定主版本的PostgreSQL并启动集群pg-build-test: 构建并测试当前目录中的PGXS扩展pgrx-build-test: 构建并测试当前目录中的pgrx扩展pgxn-bundle: 验证PGXN META.json文件并打包发布版本pgxn-release: 将扩展发布到PGXN使用Docker CLI运行pgxn-tools容器,基本命令格式如下:
shdocker run -it --rm -w /repo --volume "$PWD:/repo" pgxn/pgxn-tools \ sh -c 'pg-start 16 && pg-build-test'
此示例将当前目录挂载到容器的/repo目录,启动PostgreSQL 16,然后构建并测试该目录中的扩展。
注意:GitHub工作流容器作业必须以root运行,本节的非特权用户选项在此场景下不适用。
默认容器以root用户运行。如需以非特权用户运行,可通过AS_USER环境变量创建具有sudo权限的用户:
shdocker run -it --rm -w /repo -e AS_USER=worker \ --volume "$PWD:/repo" pgxn/pgxn-tools \ sh -c 'sudo pg-start 14 && pg-build-test'
创建的用户默认UID为1001,可通过LOCAL_UID指定本地UID以访问挂载卷中的文件:
shdocker run -it --rm -w /repo -e AS_USER=worker -e LOCAL_UID=$(id -u) \ --volume "$PWD:/repo" pgxn/pgxn-tools \ sh -c 'sudo pg-start 14 && pg-build-test'
容器中已包含nobody用户和pg-start创建的postgres用户,两者均具有无密码sudo权限。
以下工作流在每次推送和拉取请求时,针对多个PostgreSQL版本测试PGXS扩展:
yamlname: CI on: [push, pull_request] jobs: test: strategy: matrix: pg: [17, 16, 15, 14, 13, 12, 11, 10, 9.6, 9.5, 9.4, 9.3, 9.2, 9.1, 9.0, 8.4, 8.3, 8.2] name: 🐘 PostgreSQL ${{ matrix.pg }} runs-on: ubuntu-latest container: pgxn/pgxn-tools steps: - name: 启动PostgreSQL ${{ matrix.pg }} run: pg-start ${{ matrix.pg }} - name: 检出代码 uses: actions/checkout@v4 - name: 在PostgreSQL ${{ matrix.pg }}上测试 run: pg-build-test
以下工作流测试pgrx扩展,使用缓存加速依赖安装:
yamlname: CI on: [push, pull_request] jobs: test: strategy: matrix: pg: [16, 15, 14, 13, 12, 11] name: 🐘 PostgreSQL ${{ matrix.pg }} runs-on: ubuntu-latest container: pgxn/pgxn-tools steps: - name: 启动PostgreSQL ${{ matrix.pg }} run: pg-start ${{ matrix.pg }} - name: 检出代码 uses: actions/checkout@v4 - name: 设置Rust缓存 uses: Swatinem/rust-cache@v2 - name: 在PostgreSQL ${{ matrix.pg }}上测试 run: pgrx-build-test
以下工作流在推送匹配v*标签时,自动发布到PGXN和GitHub:
yamlname: Release on: push: tags: ['v[0-9]+.[0-9]+.[0-9]+'] jobs: release: name: 发布到GitHub和PGXN runs-on: ubuntu-latest container: pgxn/pgxn-tools env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: 检出代码 uses: actions/checkout@v4 - name: 打包发布版本 id: bundle run: pgxn-bundle - name: 发布到PGXN env: PGXN_USERNAME: ${{ secrets.PGXN_USERNAME }} PGXN_PASSWORD: ${{ secrets.PGXN_PASSWORD }} run: pgxn-release - name: 创建GitHub发布 id: release uses: actions/create-release@v1 with: tag_name: ${{ github.ref }} release_name: Release ${{ github.ref }} body: | 本次发布变更 - 变更1 - 变更2 - name: 上传发布资产 uses: actions/upload-release-asset@v1 with: upload_url: ${{ steps.release.outputs.upload_url }} asset_path: ./${{ steps.bundle.outputs.bundle }} asset_name: ${{ steps.bundle.outputs.bundle }} asset_content_type: application/zip
GitHub工作流需要root用户操作工作区,可通过以下方式以非特权用户执行命令:
yamlcontainer: pgxn/pgxn-tools steps: - uses: actions/checkout@v4 - run: pg-start 16 - run: chown -R postgres:postgres . - run: gosu postgres pg-build-test
或直接运行Docker镜像并指定用户:
yamlsteps: - uses: actions/checkout@v4 - run: >- docker run -w /repo --rm --volume "$(pwd):/repo" -e AS_USER=pgxn_worker -e LOCAL_UID=$(id -u) pgxn/pgxn-tools sh -c 'pg-start && pg-build-test'
pg-start安装并启动指定版本的PostgreSQL集群:
shpg-start 12 # 安装并启动PostgreSQL 12 pg-start 11 libsodium-dev # 安装PostgreSQL 11及额外依赖
PGPORT: 指定端口(默认5432)LANG: 设置集群区域(默认C.UTF-8)NO_CLUSTER: 仅安装不启动集群(需手动使用pg_createcluster)示例:修改配置文件并重启集群
sh# 获取配置文件路径 CONFIG_FILE=$(psql --no-psqlrc -U postgres -Atqc 'SHOW config_file') # 添加配置 echo "shared_preload_libraries = '$libdir/plperl'" >> $CONFIG_FILE # 重启集群 pg_ctlcluster 12 test restart
pg-build-test构建并测试当前目录的PGXS扩展:
shpg-build-test # 构建并运行测试
make && make install && make installcheckPROFILE可自定义构建参数(默认--Werror):
shexport PROFILE=--Wall && pg-build-test
pgrx-build-test构建并测试当前目录的pgrx扩展(需Cargo.toml中指定pgrx版本≥0.11.4):
shpgrx-build-test # 构建并运行测试
make installcheck(如Makefile定义该目标)pgxn-bundle验证META.json并打包发布版本:
shpgxn-bundle # 从META.json读取名称和版本并打包 # 或手动指定 PGXN_DIST_NAME=widget PGXN_DIST_VERSION=1.0.0 pgxn-bundle
GIT_ARCHIVE_CMD=archive-all: 包含Git子模块GIT_BUNDLE_OPTS: 传递给git archive的参数ZIP_BUNDLE_OPTS: 传递给zip的参数pgxn-release发布打包文件到PGXN:
shexport PGXN_USERNAME=用户名 export PGXN_PASSWORD=密码 pgxn-release # 发布当前打包文件 pgxn-release widget-1.0.0.zip # 发布指定文件
PGXN_USERNAME和PGXN_PASSWORDpgxnPGXN命令行客户端,用于安装扩展依赖:
shpgxn install semver # 安装semver扩展
pg_prove运行pgTAP测试:
shpg_prove -r --ext .sql test/ # 递归运行test目录下的.sql测试文件
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。



探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务