2

我是 DBT 新手,目前正在尝试构建一个 Docker 容器,我可以在其中直接运行 DBT 命令。我有一个文件,其中导出 env 变量 ( 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

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

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

4

3 回答 3

2

运行dbt deps是准备您的 dbt 环境的必要步骤,因此您应该感觉dbt depsDockerfile之前调用dbt run.

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

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

于 2020-12-29T08:22:32.503 回答
1

@alt-f4

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

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

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

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

于 2020-12-30T23:56:07.677 回答
0

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

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

于 2021-10-20T18:43:53.547 回答