如何在不手动运行 dbt deps 的情况下配置 DBT 依赖项?

问题描述

我是 DBT 的新手,目前正在尝试构建一个 Docker 容器,我可以在其中直接运行 DBT 命令。我有一个文件,我在其中导出环境变量 (envs.sh),如下所示:

export DB_HOST="secret"
export DB_PWD="evenabiggersecret"

我的 packages.yml 看起来像:

packages:
  - package: fishtown-analytics/dbt_utils
    version: 0.6.2

我的 docker 文件结构如下:

FROM fishtownanalytics/dbt:0.19.0b1
# Define working directory
workdir /usr/app/profile/
ENV DBT_DIR /usr/app
ENV DBT_PROFILES_DIR /usr/app
# Load ENV Vars
copY ./dbt ${DBT_DIR}
# Load env variables and install packages
copY envs.sh envs.sh
RUN . ./envs.sh \
 && dbt deps # Exporting envs to avoid profile not found errors when install deps

但是,当我在 docker 容器内运行 dbt run 时,出现错误'dbt_utils' is undefined。当我手动运行 dbt deps 时,它似乎解决了问题并且 dbt run 成功。我最初安装依赖项时是否遗漏了什么?

更新: 换句话说,在构建 Docker 镜像时运行 dbt deps 似乎没有任何效果。因此,我必须手动运行它(例如,当我执行 docker run 时),然后才能开始执行我的工作流程。当我使用 Python 图像(不是来自fishtown-analytics 的图像)时不会发生此问题

解决方法

运行 dbt deps 是准备 dbt 环境的必要步骤,因此在 dbt deps 之前调用 Dockerfile 中的 dbt run 应该感觉不错。

但是,我认为您的意图在最后一行的 RUN 指令中迷失了:要么将最后一行 RUN 命令转换为 CMD 指令,要么您可以事先自行执行 RUN dbt depts。 (有关 RUNCMD 之间差异的更多详细信息,请参阅 this question。)

而且,就其价值而言:dbt Cloud,dbt 的托管 SaaS 构建环境,也将 dbt deps 作为其所有 dbt 构建作业的标准步骤之一运行——这意味着每次都在运行时执行,类似于 Docker 的 CMD

,

@alt-f4

dbt deps does 是将软件包的本地副本安装到您​​的 project/dbt_modules/ 目录中的基础知识。

默认情况下,该目录包含在 .gitignore 中,因此可以尝试:

  1. dbt_modules中删除.gitignore
  2. 通过 dbt deps 安装到仓库
  3. 将该版本的模块提交到您的存储库中?

可能可行,但如果您采用该方法,我建议您在 packages.yml 中锁定每个包的版本。