You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Workflow中COPY命令未生成.dbt目录问题排查

问题

我的仓库结构如下:

/   
  dbt-action/
    action.yml
    Dockerfile
    entrypoint.sh
    dbt/
      profiles.yml

Workflow步骤:

- name: Run DBT
    uses: ./dbt-action

Dockerfile内容:

FROM ghcr.io/dbt-labs/dbt-redshift:1.3.latest
COPY dbt .dbt
COPY entrypoint.sh /entrypoint.sh

entrypoint脚本:

#!/bin/bash
pwd
ls -la

实际输出中未出现预期的.dbt目录,仅显示:

drwxr-xr-x 6 1001  123 4096 Jan  7 13:06 .
drwxr-xr-x 6 root root 4096 Jan  7 13:06 ..
drwxr-xr-x 8 1001  123 4096 Jan  7 13:06 .git
drwxr-xr-x 3 1001  123 4096 Jan  7 13:06 .github
drwxr-xr-x 3 1001  123 4096 Jan  7 13:06 blah
-rw-r--r-- 1 1001  123 1744 Jan  7 13:06 README.md
drwxr-xr-x 3 1001  123 4096 Jan  7 13:06 dbt-action

预期输出应包含由COPY dbt .dbt生成的.dbt目录,为何在entrypoint的ls -la输出中看不到该目录?

分析与解决

核心原因

  • Docker构建上下文错误:GitHub Actions运行自定义Docker Action时,默认以仓库根目录作为构建上下文。你的COPY dbt .dbt指令会尝试从仓库根目录读取dbt文件夹,但实际dbt在dbt-action/子目录中,导致镜像构建时根本没复制到.dbt目录。
  • 工作目录挂载覆盖:即便镜像里正确构建了.dbt,GitHub Actions会自动把仓库根目录挂载到容器的工作目录,覆盖了镜像中该路径下的内容。你看到的ls -la输出是仓库根目录的内容,而非容器镜像本身的文件系统。

修正方案

1. 修正Dockerfile的COPY路径

调整COPY指令,从当前Action目录(dbt-action/)读取dbt文件夹,同时指定容器内的绝对路径(避免被挂载覆盖):

FROM ghcr.io/dbt-labs/dbt-redshift:1.3.latest
COPY ./dbt /root/.dbt
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh  # 确保脚本可执行
ENTRYPOINT ["/entrypoint.sh"]

2. 在action.yml中指定容器工作目录

修改dbt-action/action.yml,让Action在容器内的非挂载路径运行:

name: 'Run DBT'
runs:
  using: 'docker'
  image: 'Dockerfile'
  working-directory: '/root'  # 使用dbt-redshift镜像默认的用户目录

3. 验证镜像内文件的存在

修改entrypoint脚本,直接查看容器内目标路径的内容,确认.dbt是否存在:

#!/bin/bash
# 查看镜像中构建的.dbt目录
ls -la /root/.dbt
# 查看当前工作目录(挂载的仓库根目录)
pwd
ls -la

内容的提问来源于stack exchange,提问作者Doug Fir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:20:32