资讯详情

资讯详情

act 里 --bind 与 --use-gitignore 怎么控制本地文件进入容器的同步方式

act 里 --bind 与 --use-gitignore 怎么控制本地文件进入容器的同步方式【免费下载链接】actRun your GitHub Actions locally 项目地址: https://gitcode.com/GitHub_Trending/ac/act在本地用 act 运行 GitHub Actions 时本地文件进入 job 容器的方式并不只有一种。act 默认把本地工作目录拷贝进一个具名 Docker volume拷贝过程会遵循.gitignore加上--bind后则改为把整个工作目录直接挂载进容器。这两个开关对应两种同步语义一种是“一次性拷贝 过滤”另一种是“实时挂载、不过滤”。判断当前生效的是哪一种决定了未提交的本地改动和.gitignore排除的文件能否被 workflow 读到。默认模式工作目录拷贝进具名 volume相关默认值见 cmd/root.go 中的 flag 定义--bind/-b默认falseflag 说明是 bind working directory to container, rather than copy。--use-gitignore默认trueflag 说明是 Controls whether paths specified in .gitignore should be copied into container。工作目录默认是当前目录可用--directory/-C指定。默认模式下act 为 job 容器创建具名 volume 并把它挂到容器内对应的工作目录路径上见 run_context.go 中GetBindsAndMounts的 else 分支。真正的文件拷贝发生在actions/checkout这一步act 识别出指向当前本地仓库的 checkout 后不执行真实 checkout而是执行一次CopyDir把本地工作目录拷到 checkout 路径见 step_action_remote.go。这次拷贝会传入--use-gitignore的值.gitignore里列出的路径不会拷进容器。容器端拷贝逻辑在 docker_run.go当容器用户非 root 时拷贝完成后还会对目标路径执行chown -R uid:gid。也就是说默认模式下进入容器的是 checkout 时刻的一份“过滤后的快照”之后本地工作目录的变更不会再同步进去。用 --bind 切换为挂载整个工作目录加上--bind后同步方式变为 bind mount。具体行为在 run_context.go本地工作目录以宿主机路径:容器路径的形式直接挂载macOSdarwin上挂载自动追加:delegated后缀SELinux 开启时追加:z后缀。同时本地actions/checkout步骤会被直接跳过日志输出 debug 级别的 Skipping local actions/checkout because you bound your workspace见 step_action_remote.go。这意味着容器内的工作目录就是宿主目录本身.gitignore不再参与过滤——仓库中被 ignore 的文件在容器里同样可见workflow 对文件的改动也会原样落在宿主目录上。两种模式按目标选希望容器环境与“已提交代码”一致、不希望生成物等 ignore 内容进入容器用默认拷贝需要在 workflow 中读到被 ignore 的文件、或希望本地改动实时反映到容器里用--bind。如何配置与验证在包含.github/workflows/的仓库根目录执行# 默认拷贝模式留意 docker cp 日志行 act push # bind 挂载模式-v 打开 verbose 以看到跳过 checkout 的日志 act -v --bind push # 显式关闭 .gitignore 过滤被忽略的文件也会被拷贝 act --use-gitignorefalse push判断当前处于哪种模式最直接的方式是看日志拷贝模式日志中会出现docker cp src本地工作目录 dst容器目标路径形式的一行这是CopyDir的 InfoExecutor 输出路径取值以实际环境为准。bind 模式加-v后可看到Skipping local actions/checkout because you bound your workspace且不再有工作目录的docker cp行。不想每次都写参数时act 支持把参数写进.actrc配置文件按顺序从 XDG 配置位置、~/.actrc、调用目录下的./.actrc读取见 cmd/root.go 的configLocations与args。文件里每行一个参数例如--bind --use-gitignorefalse替代路径用 --no-skip-checkout 走真实 actions/checkout如果目标根本不是“把本地文件同步进去”--no-skip-checkout可以关闭“本地 checkout 替代”逻辑flag 说明是 Use actions/checkout instead of copying local files into container。此时 checkout 步骤执行真实的actions/checkout通过 git clone 获取代码而不是拷贝本地工作目录见 step_action_remote.go 中NoSkipCheckout的判断。这条路径与--bind和默认拷贝都不同适合“按远端代码状态复现”的场景。需要注意的边界--use-gitignore只作用于拷贝路径。--bind模式下工作目录原样挂载该开关对容器内容不生效。拷贝模式下容器用户非 root 时act 会对拷贝的目标路径执行chown -R源码注释指出这一步失败通常说明“非 root 容器下的目录权限有问题”。job 运行在 host environment 模式时工作目录本来就是直接 bind 挂载的见 run_context.go 的HostEnvironment分支效果与--bind一致。文中日志行取自源码的日志输出逻辑仅用于区分模式具体路径值以实际环境为准不要当作固定输出。【免费下载链接】actRun your GitHub Actions locally 项目地址: https://gitcode.com/GitHub_Trending/ac/act创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →