我有一个
Azure pipeline
,可以执行 dotnet restore
、dotnet build
和 dotnet publish
。
最初,我们将工件发布到
Azure App Service
。
我们想切换到
Docker
。因此,我们开始在管道中创建一个 Dockerfile
和 Docker@2 task
来构建图像并将其推送到我们的 Azure Container Registry
。
在大多数示例中,我发现,在
Dockerfile
内,您必须执行 dotnet restore
、dotnet build
和 dotnet publish
。
但是,如果我已经在我的
Azure pipeline
中执行此操作,我不能将我的工件从管道复制粘贴到 Docker 映像吗?
与此问题类似:将工件传递给 Azure DevOps 中的 Docker 任务 这一个:使用 Azure DevOps Pipeline 中的工件构建 Docker
我尝试在管道末尾这样做:
- task: Docker@2
inputs:
containerRegistry: '$(containerRegistry)'
repository: '$(imageRepository)'
command: 'buildAndPush'
Dockerfile: '**/Dockerfile'
buildContext: '$(Build.ArtifactStagingDirectory)'
tags: |
$(Build.BuildId)
而且,我的
Dockerfile
,这是我项目的根源:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
COPY . App/
WORKDIR /App
EXPOSE 80
EXPOSE 443
ENTRYPOINT ["dotnet", "MyApplication.dll"]
图像已正确创建并发布到我的
Azure Container Registry
,但是当我尝试在 Docker Desktop
上运行该图像时,它告诉我该 SDK 在计算机上不可用。这是错误:
命令无法加载,可能是因为:
- 您打算执行 .NET 应用程序: 应用程序“MyApplication.dll”不存在。
- 您打算执行 .NET SDK 命令: 未找到 .NET SDK。
当我在本地环境中时,在
/bin/Debug...
下我有一个 MyApplication.dll
。所以我尝试从 sdk
生成图像:
FROM mcr.microsoft.com/dotnet/sdk:8.0
但现在错误更奇怪了:
无法执行,因为找不到指定的命令或文件。可能的原因包括:
- 您拼错了内置的 dotnet 命令。
- 您打算执行 .NET 程序,但 dotnet-MyApplication.dll 不存在。
- 您打算运行全局工具,但在 PATH 上找不到具有此名称的以 dotnet 为前缀的可执行文件。
我认为我应该坚持
aspnet
图像。
我有两个问题:我是否只是没有将(
COPY . App/
)复制到Dockerfile
中的正确位置,或者我的Dockerfile
中缺少某些东西来导入SDK?
是否可以使用我的 Azure Pipeline 生成的工件来构建 Docker 映像?
下面是我自己尝试的示例,它可以按预期工作。您可以引用它来尝试重新配置管道并确保所有必需的工件文件已复制到容器中。
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
EXPOSE 80
EXPOSE 443
COPY . .
RUN dotnet myApp.dll
ENTRYPOINT ["dotnet", "myApp.dll"]
# azure-pipelines.yml
pool:
vmImage: ubuntu-latest
steps:
- task: DotNetCoreCLI@2
displayName: 'dotnet restore'
inputs:
command: restore
projects: myApp.sln
vstsFeed: 'myFeed'
- task: DotNetCoreCLI@2
displayName: 'dotnet build'
inputs:
projects: myApp.sln
arguments: '--no-restore -c Release'
- task: DotNetCoreCLI@2
displayName: 'dotnet publish'
inputs:
command: publish
publishWebProjects: false
projects: myApp.sln
arguments: '--no-build -c Release -o "$(Build.ArtifactStagingDirectory)"'
zipAfterPublish: false
modifyOutputPath: false
- task: CopyFiles@2
displayName: 'Copy Dockerfile'
inputs:
SourceFolder: '$(Build.SourcesDirectory)'
Contents: '**/Dockerfile'
TargetFolder: '$(Build.ArtifactStagingDirectory)'
- task: Docker@2
displayName: 'Build and Push image'
inputs:
containerRegistry: DockerHub
repository: myApp
buildContext: '$(Build.ArtifactStagingDirectory)'
tags: |
$(Build.BuildId)
latest