我对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我构建了我的码头文件如下:
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时)。当我使用Python映像(不是来自fishtown-analytics的图像)时,不会发生此问题。
发布于 2020-12-29 08:22:32
运行dbt deps是准备dbt环境的必要步骤,因此在Dockerfile中调用dbt run之前调用dbt run应该感觉良好。
但是,我认为您的意图是在最后一行的RUN指令中迷失方向:要么将最后一行RUN命令转换为CMD指令,要么您可以先执行RUN dbt depts命令。(有关RUN和CMD之间差异的更多细节,请参见RUN)。
而且,值得注意的是: dbt是dbt的托管SaaS构建环境,它也运行dbt deps作为所有dbt构建作业的标准步骤之一--这意味着每次运行时都执行,类似于Docker的CMD。
发布于 2021-10-20 18:43:53
因为Dockerfile (渔业分析/dbt:0.19.0b1)中的基本映像包含/usr/app的卷声明,所以在构建过程(参见卷上的Dockerfile参考说明)期间不能修改该目录中的任何内容。因为工作目录使用的是/usr/app,所以由Dockerfile中的RUN dbt deps命令下载和安装的模块将被丢弃,而不是添加到最终映像中。python映像没有相同的卷声明,因此不会导致相同的问题。
为了解决这个问题,您可以将工作目录更改为声明的卷名以外的其他内容(例如/usr/dbt)。
发布于 2020-12-30 23:56:07
@alt-f4
dbt deps 有吗?的基本原理是将包的本地副本安装到project/dbt_modules/目录中。
默认情况下,该目录包含在.gitignore中,因此可以尝试:
dbt_modules中删除.gitignoredbt deps安装到回购可能有效,但如果您使用该路径,我建议您锁定packages.yml中的每个包。
https://stackoverflow.com/questions/65468231
复制相似问题