如何构建Docker映像并推送到Azure容器注册表

时间:2020-02-14 23:49:13

标签: docker azure-devops azure-pipelines azure-pipelines-build-task azure-container-registry

我正在使用Azure管道,并且已成功构建了管道,以构建docker映像并将其部署到Azure应用服务。

现在,我试图弄清楚如何在管道中构建docker映像,然后将其发布到工件暂存目录,以便将其推送到Azure容器注册表。我在Google各处四处寻找,看看运气如何,这将是一个三部分的问题。

除了无法弄清楚如何删除临时文件(一直拒绝访问)之外,我已经在管道中成功构建了dockerfile

Removing intermediate container 543fb86650c4
 ---> 3ccb8c3a555e
Step 10/28 : RUN del -f "./NuGet.Config"
 ---> Running in c2ba7a3266a4
C:\src\NuGet.Config
Access is denied.

映像构建从那里继续并成功,但是我试图发布工件,我想获取构建的映像并将其传递到发布管道以推送到Azure容器注册表。发布工件失败,因为它找不到图像,我真的不确定如何找到它?

##[warning]Directory 'd:\a\1\a' is empty. Nothing will be added to build artifact 'Email'.

也许我要解决所有这些错误?如果是这样,请提出一个替代方案,只记得我想将docker映像推送到azure容器注册表而不是azure应用程序服务。

问题1:如何在管道任务中删除容器内的文件?

问题2:如何将Docker映像而不是Azure应用程序服务推送到Azure容器注册表?

我正在使用UI来配置我的管道,并且没有共享的完整yaml文件,但这是view选项中的yaml:

pool:
  name: Azure Pipelines
variables:
  Parameters.ArtifactName: 'Email'

steps:
- task: Docker@2
  displayName: 'Build an image'
  inputs:
    containerRegistry: 'Azure Container'
    repository: email
    command: build
    Dockerfile: Services/Email/Email/Dockerfile
    buildContext: Services/Email
    tags: latest
    arguments: '-o $(build.artifactstagingdirectory)'

- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact'
  inputs:
    PathtoPublish: '$(build.artifactstagingdirectory)'
    ArtifactName: '$(Parameters.ArtifactName)'

问题3::一旦我将文件发布到工件暂存目录,我将如何访问该文件以将映像推送到容器注册表?

更新为包含DOCKERFILE

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1809 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1809 AS build
WORKDIR /src
COPY ["Email/Email.csproj", "Email/"]
COPY ./NuGet.Config ./
RUN dotnet restore "Email/Email.csproj" --configfile ./NuGet.Config
RUN del "./NuGet.Config"
COPY . .
WORKDIR "/src/Email"
RUN dotnet build "Email.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Email.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Email.dll"]

1 个答案:

答案 0 :(得分:1)

如何在管道任务中删除文件?

您可以使用 Delete Files 任务从座席工作目录中删除文件或文件夹。对于下面的示例。

 - task: DeleteFiles@1
   displayName: 'Delete files'
   inputs:
     SourceFolder: '$(Build.SourcesDirectory)'
     Contents: NuGet.Config

dockerfile中的命令在容器中执行,delete files命令无法删除本地驱动器上的文件。要删除容器中的文件,您可以检查this thread中讨论的方法。

更新:

2,如何将Docker映像构建推送到发布管道?

您可以在powershell任务中运行所有docker命令。因此,您可以在powershell任务中构建docker映像,并使用docker image save命令将其保存到某个位置。然后发布它以使用PublishBuildArtifacts任务。这样,您无需使用 docker任务

请检查以下示例:

- powershell: |
   docker build . -t python/test:tag1
   docker image save python/test:tag1 -o $(Build.ArtifactStagingDirectory)/imagetest.tar

- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact'
  inputs:
    PathtoPublish: '$(build.artifactstagingdirectory)'

在上述powershell任务中。我首先使用docker build命令来构建图像并将其标记为python/test:tag1,然后我使用docker image save将图像保存到 $(Build.ArtifactStagingDirectory)/imagetest.tar。然后,我可以使用PublishBuildArtifacts任务发布它。

更新:

如何在管道任务中删除容器中的文件。

您可以指定管理员在容器中删除文件,以修复拒绝访问错误。在USER Administrator之前,在您的dockerfile中添加RUN del command。请检查以下示例:

USER Administrator
RUN del remove.txt

希望上面有帮助!