我正在使用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"]
答案 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
希望上面有帮助!