Lightdash 实战:用 Docker Compose 一键构建并填充本地 Jaffle Shop 数据库(Postgres + dbt)

Lightdash 实战:用 Docker Compose 一键构建并填充本地 Jaffle Shop 数据库(Postgres + dbt) Lightdash 实战用 Docker Compose 一键构建并填充本地 Jaffle Shop 数据库Postgres dbt【免费下载链接】lightdashAgentic BI. Analytics at the speed of code ⚡️项目地址: https://gitcode.com/GitHub_Trending/li/lightdashLightdash 仓库内置了一套完整的 Jaffle Shop 演示工程其中 dbt/docker 目录 提供了一组开箱即用的 Docker Compose 配置与脚本一条命令即可在本地拉起 Postgres 数据库并自动运行 dbt 将 Jaffle Shop 的原始 CSV 数据构建为可分析的表。本文完整讲解这套「容器化建库 数据填充」流程的每一步操作并结合仓库中的docker-compose.yml、entrypoint.sh、profiles.yml等真实文件深入剖析其工作原理读完你可以独立完成本地演示库的搭建、数据验证并把 Postgres 连接到 Lightdash 或其他任意 BI 工具。整体工作方式两个服务构成的数据管道该目录的定位是在本地快速启动一个包含全部 Jaffle Shop 数据的数据库方便测试 Lightdash 功能或直接玩弄这份演示数据。从 docker-compose.yml 可以看到整个管道由两个协作服务组成postgres数据库本身你可以用任何 SQL 工具连上来查询数据dbt运行 dbt-core 的容器服务负责把 Jaffle Shop 这个 dbt 项目「转化」为 Postgres 中的可用数据建表、灌数、跑模型。两个服务的依赖与数据流如下dbt服务通过depends_on: [postgres]声明启动顺序依赖确保 Postgres 先就绪dbt服务把仓库目录挂载进容器..:/usr/app并在容器内执行自定义 entrypoint.sh 完成建数postgres服务把5432端口映射到宿主机设置restart: always保证数据库持久运行。# examples/full-jaffle-shop-demo/dbt/docker/docker-compose.yml原文 services: dbt: image: fishtownanalytics/dbt:0.21.0 depends_on: - postgres volumes: - ..:/usr/app entrypoint: /usr/app/docker/entrypoint.sh postgres: image: postgres restart: always environment: POSTGRES_PASSWORD: password ports: - 5432:5432几个值得注意的配置细节dbt 镜像版本固定为fishtownanalytics/dbt:0.21.0。dbt 0.21 时代dbt seed/dbt run尚不支持--project-dir参数所以 entrypoint 采用「以挂载的仓库根目录为工作目录 --profiles-dir ./docker」的方式运行见下文源码解析卷挂载..:/usr/app..指向dbt/工程根目录包含dbt_project.yml、models/、data/、docker/等挂载后 dbt 容器内可直接读到完整工程Postgres 密码通过POSTGRES_PASSWORD: password环境变量注入即后文连接信息中password: password的由来官方postgres镜像未固定 tag实际拉取时以 Docker Hub 上该镜像的默认latest版本为准。Step 1. 获取代码根据你是否要修改 Jaffle Shop 的数据模型选择对应方式选项 1只体验、不改模型直接克隆官方 Jaffle Shop 仓库文档原文指向gitgithub.com:lightdash/jaffle_shop即 Lightdash 维护的 jaffle_shop 仓库git clone gitgithub.com:lightdash/jaffle_shop cd jaffle_shop/docker选项 2要改数据模型在 GitHub 页面上点击fork按钮创建自己的 Fork然后克隆你自己的仓库把your_profile_name替换为你的用户名git clone gitgithub.com:your_profile_name/jaffle_shop cd jaffle_shop/docker本仓库内的等价路径如果你已经拿到了 Lightdash 仓库本身无需另行克隆。演示工程完整内置于 examples/full-jaffle-shop-demo/dbt直接cd到examples/full-jaffle-shop-demo/dbt/docker即可执行后续所有步骤。该目录与官方 jaffle_shop 仓库的docker/目录结构一致start.sh、stop.sh、connect.sh、entrypoint.sh、profiles.yml、docker-compose.yml、README.md齐全且模型覆盖面更广——除了经典 customers/orders/payments本仓库版本还内置了订阅、营销活动、漏斗、地图、医疗等多个主题模型见 dbt_project.yml 中按group_label分组的 model 配置。Step 2. 安装 Docker本流程依赖 Docker 与 Docker Compose 命令脚本中直接调用docker compose需要先在机器上安装 Docker并确保docker compose子命令可用。Step 3. 一条命令建库并灌入 Jaffle 数据在docker/目录下执行./start.sh启动脚本 的全部内容就一行docker compose up -d -V参数含义-d后台detached模式启动不占用终端-V同时创建并启动命名卷本 compose 文件未显式定义 volume此参数主要保证任何声明的卷都被初始化。执行后发生的事Compose 先拉起postgres容器restart: always数据库常驻dbt容器随后启动执行挂载进来的 entrypoint 脚本自动完成「灌种子数据 跑模型」两步原理见下一节首次运行需要下载postgres与fishtownanalytics/dbt:0.21.0两个镜像耗时较长属正常现象之后再运行则秒级启动。深入解析entrypoint.sh 里的两行 dbt 命令entrypoint.sh 是「数据库如何被填满」的关键全文仅两行核心命令#!/bin/bash set -e dbt seed --profiles-dir ./docker dbt run --profiles-dir ./dockerdbt seed把 data/ 目录下的原始 CSV 物化为目标 schema 中的表。本演示工程刻意用 seed 而非 source 来保持自包含原始数据直接以 CSV 形式随仓库分发。本仓库版本的种子数据包括raw_customers.csv、raw_orders.csv、raw_payments.csv、raw_subscriptions.csv、raw_plan.csv等数十个文件覆盖订阅、营销活动、漏斗、地图、医疗等主题dbt run编译并运行 models/ 下的全部 SQL 模型本仓库版本含 60 余个.sql模型把原始表加工成面向分析的事实表与维度表例如customers、orders、payments、subscriptions等--profiles-dir ./docker指向容器内/usr/app/docker/目录下的 profiles.yml因为工程被挂载到/usr/appset -e任一步骤失败立即终止避免在空库上「假装成功」。深入解析profiles.yml 如何连接 Postgresprofiles.yml 定义了 dbt 与数据库的连接方式config: send_anonymous_usage_stats: false jaffle_shop: outputs: default: type: postgres threads: 4 host: postgres port: 5432 user: postgres pass: password dbname: postgres schema: jaffle逐参数说明参数值说明typepostgres使用 Postgres 适配器threads4dbt 并行执行线程数hostpostgres注意这里写的是服务名postgres而非localhost——dbt 容器运行在同一个 Compose 网络内通过服务名解析到数据库容器port5432Postgres 默认端口user/passpostgres/password与 compose 中POSTGRES_PASSWORD一致dbnamepostgres默认库schemajaffledbt 自动创建并使用的目标 schema即验证数据时查询jaffle.payments的由来config.send_anonymous_usage_statsfalse关闭 dbt 匿名使用统计上报此外dbt_project.yml 声明了工程的目录布局model-paths: [models]、seed-paths: [data]、macro-paths: [macros]并配置了物化策略顶层模型默认materialized: tablestaging/子目录下的模型为view同时为raw_customers.created、raw_orders.order_date等种子列显式指定了column_types如timestamp、date、numeric保证 seed 后列类型符合模型 SQL 的假设。Step 4. 验证数据已就绪可以直接用 psql 连入 Postgres 检查数据是否灌入。connect.sh 的内容是docker compose exec postgres psql -U postgres postgres它会进入一个交互式 psql 会话在其中执行select * from jaffle.payments;如果查询返回行数据说明 seed 与 run 均已成功如果查询没有数据说明流程某处出了问题可回到docker compose logs dbt查看 dbt 容器日志定位失败原因退出 psql按Ctrl-dcontrol 键加d。Step 5. 从其他工具连接例如 Lightdash以下连接信息适用于任意工具连接这个本地 Postgresport: 5432 host: localhost ( or host.docker.internal if accessing from another docker container ) user: postgres password: password database: postgres schema: jaffle ssl: false ( or disabled )关键差异点——host 怎么填工具运行在宿主机上用localhost因为 compose 已把5432映射到宿主机工具运行在另一个 Docker 容器里典型场景用仓库根的 install.sh 容器化方式安装 Lightdash 后在 Lightdash 里配置 warehouse connection必须用host.docker.internal才能穿透到宿主机上被映射出来的 5432 端口。本仓库内 examples/full-jaffle-shop-demo/dbt/README.md 给出的 Lightdash 仓库连接参数与此完全一致type: postgres、host:host.docker.internal、user:postgres、password:password、database:postgres、schema:jaffle、port:5432、ssl: disable。Step 6. 停止全部服务./stop.shstop.sh 的内容为docker compose downdocker compose down会停止并移除postgres与dbt两个容器。注意它不会删除命名卷因此 Postgres 的数据目录若挂载了卷在下次./start.sh后依然可用若数据容器本身未持久化重新start.sh时 dbt 也会重新 seed 与 run 一遍数据库会再次被完整填充。附录全流程速查步骤命令 / 操作对应文件启动并灌数./start.sh即docker compose up -d -Vstart.sh容器内建数逻辑dbt seeddbt runentrypoint.sh连接配置profiles.ymlhost 为服务名postgresprofiles.yml验证数据./connect.sh后执行select * from jaffle.payments;connect.sh停止服务./stop.sh即docker compose downstop.sh服务编排dbt 0.21.0 镜像 官方 postgres 镜像5432 端口映射docker-compose.yml适用前提与限制机器需安装 Docker 且docker compose子命令可用5432端口需空闲否则需调整 compose 的端口映射dbt 镜像固定为fishtownanalytics/dbt:0.21.0--profiles-dir写法是适配该版本的行为升级 dbt 版本时需同步调整 entrypoint 的调用方式官方postgres镜像未锁版本首次拉取与后续升级行为以镜像默认 tag 为准演示数据中的敏感值password: password仅用于本地开发切勿照搬到任何共享或生产环境本流程的目标产物是 schema 为jaffle的本地演示库供 Lightdash 连接与功能测试使用不构成生产级部署方案。【免费下载链接】lightdashAgentic BI. Analytics at the speed of code ⚡️项目地址: https://gitcode.com/GitHub_Trending/li/lightdash创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考