当前位置: 首页 > 知识库问答 >
问题:

如何构建docker映像并推送到azure容器注册表

楚威
2023-03-14

我正在使用 Azure 管道,并已成功构建一个管道来生成 docker 映像并将其部署到 azure 应用服务。

现在我试图弄清楚如何在管道中构建docker映像,然后将其发布到工件暂存目录,以便我可以将其推送到azure容器注册表。我在谷歌上找遍了,看看这是如何完成的,但运气不好,这将是一个由三部分组成的问题。

我成功地在我的管道中构建了一个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 app服务?

我正在使用UI配置我的管道,并且没有完整的yaml文件要共享,但这是来自视图选项的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个答案

陈马鲁
2023-03-14

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

您可以使用“删除文件”任务从代理工作目录中删除文件或文件夹。对于以下示例。

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

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

更新:

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

您可以在powershell任务中运行所有docker命令。因此,您可以在powershell任务中构建您的docker镜像,并使用docker镜像保存命令将其保存到一个地方。然后将其发布到使用PublishBuild工件任务。这样您就不需要使用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)'

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

更新:

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

您可以指定管理员来销毁容器内的文件,以修复拒绝访问错误。在 RUN del 命令之前在 dockerfile 中添加 USER 管理员。检查以下示例:

USER Administrator
RUN del remove.txt

以上希望有帮助!

 类似资料:
  • 我无法将docker映像推送到低于错误的工件注册表 登录和拉取工作正常 詹金斯档案: Dockerfile: 我不确定这是怎么回事。我可以在jenkins从属节点上手动推送图像。但使用詹金斯会产生错误 我构建工作的日志 这是我的构建日志中的内容。

  • 我无法将docker映像推送到heroku注册表。 根据docker的说法,我已成功登录: 在那之后,我运行了,我得到了一些令人困惑的错误,说我试图推送到一个不安全的repo,而de-output中的url看起来是安全的(以https开头)。我做错了什么? 我正在使用以下jib配置: jib的Maven输出:build wiht-X:

  • 问题内容: 在尝试设置可以构建docker映像的Gitlab CI时,发现最初仅对单独的跑步者启用了DinD,而Blog Post 建议尽快对共享跑步者启用DinD , 运行DinD需要在运行程序中启用特权模式,该模式在注册运行程序时设置为标志,但找不到共享运行程序的等效机制 问题答案: 共享的运行器现在可以构建Docker映像。这是您可以使用的工作: 该作业假定您正在使用Gitlab提供的Con

  • 我想把我的形象推广到Docker Hub。这项任务似乎很简单,但我对细节一无所知。 变量的值应该是什么,以及如何构造它?这些说明似乎可以解释,但我不明白。

  • 问题内容: 我已经创建了自己的docker文件(该文件运行一个显示“ helloworld”的shell脚本)。图像是“ hellodocker”,标签是“ mytag”,我现在拥有: 如何将Docker映像推送到dockerhub?我用。这给出了“无此类ID”错误。我想念什么?提前致谢。 问题答案: 您要么在构建时就将其标记为标签,例如 或创建绑定到同一图像的新标签,即

  • JHipster现在使用maven jib插件。在此之前,运行在docker容器中的jenkins服务器能够用*创建docker映像。war文件,并通过使用“Jenkinsfile”的管道将其推送到我自己的docker注册表(对于gradle,但我现在切换到Maven),在作业完成后,另一个作业通过使用ssh在远程主机上执行shell脚本,将新构建的docker映像拉到我服务器上的新docker容

  • 我正在使用fabric8 maven插件在Google云平台上运行的Jenkins上构建Docker映像。 该插件提供了将图像推送到Docker注册表的功能,但我无法使其与Google容器注册表一起工作,因为它无法进行身份验证。 从我的Jenkins管道中,我可以使用和访问注册表。 对于访问Docker注册中心,Fable8 Maven插件可以与凭据或扩展身份验证一起使用,但这似乎仅适用于AWS。

  • 我目前正在开发Quarkus应用程序,因此需要一个CI管道容器注册表。 由于通过docker的集装箱化不起作用(docker daemon-priviliged模式),我想使用Jib,Quarkus已经支持它。 正在处理的命令: 用户名=部署令牌用户名 密码=部署令牌 部署令牌拥有所有权限,所以这不应该是问题所在。 我还尝试了在注册表url中添加令牌的命令的不同变体: https://userna