Github Actions构建容器时出现构建上下文路径越界错误
问题
我有一个.NET多项目解决方案正在进行容器化,尝试通过Github Actions实现自动化构建。简化后的文件结构如下:
repo/ ├── Solution.sln └── src/ ├── Core/ │ └── Project.Domain/ │ └── Project.Domain.csproj └── Presentation/ └── Project.API/ ├── Project.API.csproj └── Dockerfile
API项目依赖Domain项目,且该解决方案中将有多个Dockerfile。我的Dockerfile开头内容如下:
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env WORKDIR /App COPY ../../../ ./ # 其余构建步骤...
在本地(Windows系统Git Bash搭配Docker Desktop)使用以下命令构建容器可成功:
$ pwd /path/to/repo $ docker build -f ./src/Presentation/Project.API/Dockerfile .
但在Github Actions工作流中执行相同构建命令时,出现错误:
Step 3/11 : COPY ../../../ ./ COPY failed: forbidden path outside the build context: ../../../ ()
原因分析
本地构建成功是因为Windows环境下的Docker Desktop对相对路径的解析存在宽松处理:当你指定构建上下文为repo根目录(.)时,即便Dockerfile里写了../../../,实际还是指向上下文内的根目录,没有超出边界。
而Github Actions的运行环境是Linux系统,Docker对路径的解析严格遵循规则:从Dockerfile所在的src/Presentation/Project.API目录向上回溯三层,已经超出了构建上下文(repo根目录)的范围,因此触发"禁止访问上下文外路径"的安全限制。
修复方案
方案1:简化COPY指令(推荐)
既然构建上下文是repo根目录,直接基于上下文根路径编写COPY指令,无需向上回溯:
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env WORKDIR /App # 复制构建上下文(repo根目录)的所有内容到容器内的/App COPY . ./ # 后续恢复依赖、编译等步骤...
这种方式在本地和Github Actions环境下都能正常工作,避免路径解析问题。
方案2:精细化复制(优化构建效率)
如果不想复制整个repo目录,可以只复制必要的文件,减少构建上下文大小:
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env WORKDIR /App # 复制解决方案文件 COPY Solution.sln ./ # 复制Domain项目目录 COPY src/Core/Project.Domain/ ./src/Core/Project.Domain/ # 复制API项目目录 COPY src/Presentation/Project.API/ ./src/Presentation/Project.API/ # 恢复依赖: RUN dotnet restore Solution.sln # 编译项目: RUN dotnet build src/Presentation/Project.API/Project.API.csproj -c Release -o /App/build
确保构建命令正确
在Github Actions工作流中,保持和本地一致的构建命令,确保构建上下文是repo根目录:
docker build -f ./src/Presentation/Project.API/Dockerfile .
内容的提问来源于stack exchange,提问作者Sarmad Georgie
相关产品推荐
相关产品推荐

