簡體   English   中英

如何構建 docker 鏡像並推送到 azure 容器注冊表

[英]How to build docker image and push to azure container registry

我正在使用 Azure Pipelines 並成功構建了一個管道來構建 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 應用服務?

我正在使用 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"]

如何刪除管道任務中的文件?

您可以使用刪除文件任務從代理工作目錄中刪除文件或文件夾。 對於下面的例子。

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

dockerfile 中的命令是在容器中執行的,delete files 命令不能刪除本地驅動器上的文件。 要刪除容器內的文件,您可以檢查此線程中討論的方法。

更新:

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 savedocker image save$(Build.ArtifactStagingDirectory)/imagetest.tar 然后我可以使用 PublishBuildArtifacts 任務發布它。

更新:

如何在管道任務中刪除容器內的文件。

您可以指定管理員刪除容器內的文件以修復拒絕訪問錯誤。 RUN del command之前在您的 dockerfile 中添加USER Administrator 檢查以下示例:

USER Administrator
RUN del remove.txt

希望以上有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM