首页 > 解决方案 > Azure 管道从错误的 Dockerfile 构建映像

问题描述

我的项目包含 2 个 Dockerfile,一个用于后端,一个用于模拟数据库。我在 Azure 中有一个使用以下脚本的构建管道:

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

- task: CopyFiles@2
  inputs:
    SourceFolder: './MyProject'
    Contents: '**'
    TargetFolder: '$(build.artifactStagingDirectory)'
    flattenFolders: true

- task: CopyFiles@2
  inputs:
    SourceFolder: './MyProject/Database'
    Contents: '**'
    TargetFolder: '$(build.artifactStagingDirectory)/Database'
    flattenFolders: true

- task: ArchiveFiles@2
  displayName: "Archive files"
  inputs:
    rootFolderOrFile: "$(build.artifactStagingDirectory)"
    includeRootFolder: true
    archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(build.artifactStagingDirectory)'
    ArtifactName: 'backend'

我在那里放了 2 个 CopyFiles 步骤,因为我有 2 个 Dockerfile,一个在 /MyProject 中用于后端,一个在 /MyProject/Database 中用于模拟数据库。这样我可以稍后在我的发布管道中在两个 Dockerfile 之间进行选择。在下图中,我在后端文件夹中标记了一个 Dockerfile,您可以在 Database 文件夹中看到另一个 Dockerfile。

在此处输入图像描述

问题是,即使我为发布步骤选择放置在后端文件夹中的 Dockerfile,管道仍将 Dockerfile 用于数据库。大概这是因为这是它遇到的第一个 Dockerfile,即使它位于我指定的子目录中。如何让我的管道使用正确的 Dockerfile?

标签: dockerazure-devopsdockerfile

解决方案


发现问题:设置 flattenFolders: true 这样做是为了让子目录中的 Dockerfile 覆盖了顶层 Dockerfile。通过将其设置为 false,我得到了完整的文件夹结构,并且可以选择正确的 Dockerfile。


推荐阅读