【问题标题】:How can I configure DBT Dependencies without manually running dbt deps?如何在不手动运行 dbt deps 的情况下配置 DBT 依赖项?
【发布时间】:2020-12-27 17:04:01
【问题描述】:

我是 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 的图像)时,不会发生此问题

【问题讨论】:

    标签: docker dbt


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨 Nick = ) 我遇到的问题是在 Dockerfile 本身中运行 dbt deps 似乎没有任何效果。运行容器时需要手动运行。但是,当我使用 Python 映像并安装 dbt 时,它似乎在那里工作
    • 我还更新了我的问题以更好地说明问题
    • @alt-f4 我相应地更新了答案 - 如果这有帮助,请告诉我!我认为您最后一次RUN 之后的图像状态根本没有被“提交”,所以就好像dbt deps 从未运行过......
    【解决方案2】:

    @alt-f4

    dbt depsdoes 的基本原理是将包的本地副本安装到您​​的 project/dbt_modules/ 目录中。

    默认情况下,该目录包含在 .gitignore 中,所以不妨试试:

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

    可能有效,但如果你走这条路,我建议在 packages.yml 中锁定每个包的版本。

    【讨论】:

      【解决方案3】:

      由于 Dockerfile (fishtownanalytics/dbt:0.19.0b1) 中的基本映像包含 /usr/app 的 VOLUME 声明,因此您无法在构建过程中修改该目录中的任何内容 (see Dockerfile reference notes on VOLUME)。由于工作目录使用 /usr/app,Dockerfile 中的 RUN dbt deps 命令正在下载和安装的模块将被丢弃,而不是添加到最终映像中。 python 图像没有相同的 VOLUME 声明,因此不会导致相同的问题。

      要解决这个问题,您可以将工作目录更改为声明的卷名以外的其他名称(例如,/usr/dbt)。

      【讨论】:

        【解决方案4】:

        您需要将相关包添加到packages.yml。我认为它不会直接在 Fishtown 图像中可用。您可能想在本地的 package.yml 文件中添加所需的包并将其复制到 dbt 目录。之后 dbt deps 应该能够安装这些包。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-03-01
          • 1970-01-01
          • 2021-12-22
          • 2021-11-21
          • 2022-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多