如何在不手动 运行 dbt deps 的情况下配置 DBT 依赖项?
How can I configure DBT Dependencies without manually running dbt deps?
我是 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
成功了。我最初安装依赖项时是否遗漏了什么?
更新:
也就是说,运行ning dbt deps
在构建Docker 镜像时,似乎没有任何效果。所以我必须手动 运行 它(例如当我做 docker 运行 时)才能开始我的工作流程。当我使用 Python 图像(不是来自 fishtown-analytics 的图像)
时,不会发生此问题
运行 dbt deps
是准备 dbt 环境的必要步骤,因此在 dbt run
之前的 Dockerfile
中调用 dbt deps
应该感觉良好.
不过,我认为您的意图在最后一行的 RUN
指令中迷失了:最后一行 RUN
命令应该转换为 CMD
指令或者您可以先自行执行 RUN dbt depts
。 (有关 RUN
和 CMD
之间差异的更多详细信息,请参阅 。)
而且,就其价值而言:dbt Cloud,dbt 的托管 SaaS 构建环境,也是 运行s dbt deps
作为所有 dbt 构建作业的标准步骤之一——意味着执行在 运行 次,每次,类似于 Docker 的 CMD
.
@alt-f4
dbt deps
does 的基础是将软件包的本地副本安装到您的 project/dbt_modules/
目录中。
默认情况下,该目录包含在 .gitignore 中,所以可以尝试:
- 从
.gitignore
中删除 dbt_modules
- 通过
dbt deps
安装到 repo
- 将该版本的模块提交到您的存储库中?
可能行得通,但如果您走那条路,我建议将版本锁定在 packages.yml 中的每个包。
因为 Dockerfile 中的基础镜像 (fishtownanalytics/dbt:0.19.0b1) includes a VOLUME declaration for /usr/app, you can't modify anything in that directory during the build process (see Dockerfile reference notes on VOLUME)。因为工作目录使用 /usr/app,Dockerfile 中通过 RUN dbt deps
命令下载和安装的模块将被丢弃,而不是添加到最终镜像中。 python 图像没有相同的 VOLUME 声明,因此不会导致相同的问题。
要解决这个问题,您可以将工作目录更改为声明的卷名以外的目录(例如,/usr/dbt)。
您需要将相关包添加到packages.yml。我认为它不会直接出现在 Fishtown 图像中。您可能想在本地 package.yml 文件中添加所需的包,并将其复制到 dbt 目录。之后 dbt deps 应该能够安装这些包。
我是 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
成功了。我最初安装依赖项时是否遗漏了什么?
更新:
也就是说,运行ning dbt deps
在构建Docker 镜像时,似乎没有任何效果。所以我必须手动 运行 它(例如当我做 docker 运行 时)才能开始我的工作流程。当我使用 Python 图像(不是来自 fishtown-analytics 的图像)
运行 dbt deps
是准备 dbt 环境的必要步骤,因此在 dbt run
之前的 Dockerfile
中调用 dbt deps
应该感觉良好.
不过,我认为您的意图在最后一行的 RUN
指令中迷失了:最后一行 RUN
命令应该转换为 CMD
指令或者您可以先自行执行 RUN dbt depts
。 (有关 RUN
和 CMD
之间差异的更多详细信息,请参阅
而且,就其价值而言:dbt Cloud,dbt 的托管 SaaS 构建环境,也是 运行s dbt deps
作为所有 dbt 构建作业的标准步骤之一——意味着执行在 运行 次,每次,类似于 Docker 的 CMD
.
@alt-f4
dbt deps
does 的基础是将软件包的本地副本安装到您的 project/dbt_modules/
目录中。
默认情况下,该目录包含在 .gitignore 中,所以可以尝试:
- 从
.gitignore
中删除 - 通过
dbt deps
安装到 repo - 将该版本的模块提交到您的存储库中?
dbt_modules
可能行得通,但如果您走那条路,我建议将版本锁定在 packages.yml 中的每个包。
因为 Dockerfile 中的基础镜像 (fishtownanalytics/dbt:0.19.0b1) includes a VOLUME declaration for /usr/app, you can't modify anything in that directory during the build process (see Dockerfile reference notes on VOLUME)。因为工作目录使用 /usr/app,Dockerfile 中通过 RUN dbt deps
命令下载和安装的模块将被丢弃,而不是添加到最终镜像中。 python 图像没有相同的 VOLUME 声明,因此不会导致相同的问题。
要解决这个问题,您可以将工作目录更改为声明的卷名以外的目录(例如,/usr/dbt)。
您需要将相关包添加到packages.yml。我认为它不会直接出现在 Fishtown 图像中。您可能想在本地 package.yml 文件中添加所需的包,并将其复制到 dbt 目录。之后 dbt deps 应该能够安装这些包。