是否可以使用我的 Azure Pipeline 生成的工件来构建 Docker 映像?

问题描述 投票:0回答:1

我有一个

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 映像?

c# azure docker azure-pipelines
1个回答
0
投票

下面是我自己尝试的示例,它可以按预期工作。您可以引用它来尝试重新配置管道并确保所有必需的工件文件已复制到容器中。

  1. Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
EXPOSE 80
EXPOSE 443

COPY . .
RUN dotnet myApp.dll
ENTRYPOINT ["dotnet", "myApp.dll"]
  1. 管道 YAML。
# 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
© www.soinside.com 2019 - 2024. All rights reserved.