我正在尝试创建一个部署管道,以将映像部署到Kubernetes集群。此过程的第一步是基于docker文件创建映像。当我添加docker支持并右键单击docker映像并选择创建它时,我正在使用的docker文件是从Visual Studio生成的,并成功创建了该映像。当我配置Azure管道时,创建docker映像会在尝试构建实际解决方案时立即失败。上一步获取了所有源文件,但随后使用
创建docker镜像失败[error]COPY failed: stat/var/lib/docker/tmp/docker-builder158012929/DockerTest/DockerTest.csproj:
no such file or directory
[error]/usr/bin/docker failed with return code: 1
以下是从Visual Studio生成的docker文件,azure管道阶段会引用该文件来创建docker映像。
FROM mcr.microsoft.com/dotnet/core/runtime:2.2-stretch-slim AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS
build
WORKDIR /src
COPY ["DockerTest/DockerTest.csproj", "DockerTest/"]
RUN dotnet restore "DockerTest/DockerTest.csproj"
COPY . .
WORKDIR "/src/DockerTest"
RUN dotnet build "DockerTest.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "DockerTest.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "DockerTest.dll"]
## [部分]开始:构建容器映像
================================================== =============================任务:Docker描述:构建,标记,推送或运行Docker映像,或者 运行Docker命令任务可以与Docker或Azure容器一起使用 注册表。版本:0.150.6作者:Microsoft Corporation帮助: [更多信息] https://go.microsoft.com/fwlink/?linkid=848006)
================================================== =========================== [命令] / usr / bin / docker build -f
/ home / vsts / work / 1 / s / DockerTest / Dockerfile -t ihacontainers.azurecr.io/dockertest:6 / home / vsts / work / 1 / s / DockerTest 将构建上下文发送到Docker守护程序6.144kB步骤1/15:FROM mcr.microsoft.com/dotnet/core/runtime:2.2-stretch-slim AS基础 2.2-stretch-slim:从dotnet / core / runtime提取743f2d6c1f65:提取fs层074da88b8de0:提取fs层ac831735b47a:提取 fs层3adcc844418d:拉紧fs层3adcc844418d:等待 ac831735b47a:下载完整的743f2d6c1f65:验证校验和 743f2d6c1f65:下载完成074da88b8de0:验证校验和 074da88b8de0:下载完整的3adcc844418d:验证校验和 zadcc844418d:下载完成743f2d6c1f65:拉取完成 074da88b8de0:拉动完成ac831735b47a:拉动完成3adcc844418d: 拉完整的摘要: sha256:066c31b113b0a20e6155d3bd8a314563c688d2ec31c11d7e551af5bc2595f30c 状态:已下载更新的图片 mcr.microsoft.com/dotnet/core/runtime:2.2-stretch-slim ---> c0f9ab44ecc1步骤2/15:WORKDIR / app --->在6d1a5f5600dd中运行 卸下中间容器6d1a5f5600dd ---> 527fcebeaf1f步骤 3/15:从mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS构建 2.2拉伸:从dotnet / core / sdk提取c5e155d5a1d1:提取fs层221d80d00ae9:提取fs层4250b3117dca:提取fs层 3b7ca19181b2:拉fs层3466298fc231:拉fs层 310737d73ed1:拉fs层dc981de74fae:拉fs层 3b7ca19181b2:等待中3466298fc231:等待中310737d73ed1:等待中 dc981de74fae:等待4250b3117dca:验证校验和4250b3117dca: 下载完整的221d80d00ae9:验证校验和221d80d00ae9: 下载完整的3466298fc231:验证校验和3466298fc231: 下载完整的c5e155d5a1d1:验证校验和c5e155d5a1d1: 下载完整的3b7ca19181b2:验证校验和3b7ca19181b2: 下载完整的c5e155d5a1d1:提取完整221d80d00ae9:提取 完整的310737d73ed1:验证校验和310737d73ed1:下载 完整的4250b3117dca:拉完整的dc981de74fae:校验和 dc981de74fae:下载完成3b7ca19181b2:拉取完成 3466298fc231:拉出完整的310737d73ed1:拉出完整的dc981de74fae: 拉完整的摘要: sha256:222cc0bb0bc93875ee0f6be626b2838beea838f65e53653e07c33eb9d00b0163 状态:已下载更新的图片 mcr.microsoft.com/dotnet/core/sdk:2.2-stretch ---> e4747ec2aaff步骤 4/15:WORKDIR / src->在a7ebcac87f68中运行删除 中间容器a7ebcac87f68 ---> d7541674a9da步骤5/15: COPY [“ DockerTest / DockerTest.csproj”,“ DockerTest /”] COPY失败:统计 /var/lib/docker/tmp/docker-builder158012929/DockerTest/DockerTest.csproj:否 这样的文件或目录## [错误]复制失败:stat / var / lib / docker / tmp / docker-builder158012929 / DockerTest / DockerTest.csproj:否 此类文件或目录
## [错误] / usr / bin / docker失败,返回代码:1 ## [section]完成:构建容器映像
答案 0 :(得分:2)
我通过使用与Visual Studio中相同的dockerfile将buildContext设置为'$ {Build.Repository.LocalPath)'来解决此问题,而无需调整路径:
在YAML-Konfiguration中,我添加了以下行:
buildContext: '$(Build.Repository.LocalPath)'
答案 1 :(得分:0)
[错误]复制失败:stat / var / lib / docker / tmp / docker-builder158012929 / DockerTest / DockerTest.csproj:没有此类文件或目录
根据此错误消息,该错误发生在您的dockerfile行中:COPY ["DockerTest/DockerTest.csproj", "DockerTest/"]
。
首先,请确认您没有使用.dockerignore
文件来排除此文件:DockerTest/DockerTest.csproj
,该文件必须存在于运行生成文件的目录中。
如果.dockerignore
文件没有忽略它,那么您需要考虑dockerfile的位置级别。
DockerTest.csproj
文件不应放在较低的源文件路径级别。您需要更改上下文的来源,并将其移到更高的级别。因此,将您的dockerfile手动修改为:
COPY ["DockerTest.csproj", "DockerTest/"]
答案 2 :(得分:0)
当您通过Visual Studio(至少v16.3.9)生成Docker支持并且您在Azure Pipeline中将此生成的项目与预定义的Docker Pipeline模板一起使用时,就会出现此问题。称为经典编辑器的方式,或称为现代编辑器的新型的四步易于点击的方式。
生成的文件中的更改
COPY ["DockerTest/DockerTest.csproj", "DockerTest/"]
到
COPY ["DockerTest.csproj", "DockerTest/"]
解决了Azure管道的问题,但它会破坏您在Visual Studio中的本地版本。
添加
buildContext: '$(Build.Repository.LocalPath)'
对现代编辑器生成的YAML文件将会中断构建任务。现代编辑器中使用的模板依赖于默认的构建上下文,并且解析器无法识别 buildContext
命令。
解决此问题的唯一可能方法是覆盖默认的构建上下文。此替代将在Visual Studio或Azure Pipeline中保留构建功能。
可以在经典编辑器中的构建映像任务中覆盖构建上下文。
答案 3 :(得分:0)
对我来说,它可以使用以下Yaml设置
步骤:
任务:Docker @ 2
displayName:构建docker
输入:
命令:“ buildAndPush”
Dockerfile:“ ** / Dockerfile”
buildContext:'$(Build.Repository.LocalPath)'
dockerfile可以保持在Visual Studio生成的状态。
答案 4 :(得分:0)
就我而言,我具有以下文件夹结构:
id | username |
------------------------
1 | zak |
2 | mike |
3 | john |
我的docker文件位于项目文件夹中。
修改为仅在第一个副本中使用CSPROJ文件,并收到缺少的MAIN方法错误,并且没有合适的静态主入口点后,我将其替换为将“ copy ..”替换为“ COPY。[project_name] /” < / p>
id | experience| user_class
---------------------------------
1 | 22 | Ninja
2 | 01 | Ninja
3 | 34 | Pirate
答案 5 :(得分:0)
尝试将 Dockerfile 移动到根目录,以及 .sln 文件。
其他答案都不适合我,它永远找不到 csproj 文件的项目路径。
我的项目只包含一个需要容器化的项目,还有一些支持dll的项目,所以我把Visual Studio创建的原始Dockerfile和.sln文件一起移到了根目录,我们的pipeline构建了镜像并部署了它到我们的 ACR 没问题。
我认为其他解决方案,如果它们对您有用,会更好,但如果不是,并且它适用于您的情况,请试一试。