本章咱們要實現的是經過咱們往代碼倉庫push代碼後,咱們將每次的push進行一次docker自動化打包發佈到docker hub中,發佈到以後我將進行部署環節,咱們將經過ssh方式將咱們的.NET應用程序pull並run到咱們的雲服務器上。docker
Dockerfile 以下所示:ubuntu
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build WORKDIR /src COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"] RUN dotnet restore "WebApplication1/WebApplication1.csproj" COPY . . WORKDIR "/src/WebApplication1" RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "WebApplication1.dll"]
這個環節咱們將推送docker鏡像到dockerhub中,關於pipeline的配置能夠參考一下前兩章對於dockerhub推送都有介紹服務器
# ASP.NET Core # Build and test ASP.NET Core projects targeting .NET Core. # Add steps that run tests, create a NuGet package, deploy, and more: # https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core trigger: - demo04 pool: vmImage: 'ubuntu-latest' variables: buildConfiguration: 'Release' steps: - task: UseDotNet@2 inputs: packageType: 'sdk' version: '3.x' - task: DotNetCoreCLI@2 inputs: command: 'restore' feedsToUse: 'select' - task: DotNetCoreCLI@2 inputs: command: 'build' - task: DotNetCoreCLI@2 inputs: command: 'publish' publishWebProjects: true - task: Docker@2 inputs: containerRegistry: 'DockerHub' repository: '$(repository)' command: 'buildAndPush' Dockerfile: 'WebApplication1/Dockerfile' buildContext: '.' tags: 'latest'
第一步咱們須要先去service connection中區建立一個ssh的鏈接信息,以用於後續的操做。app
接下來咱們須要建立一個 release pipeline 用於咱們部署的操做,以下圖所示:less
下圖的四個task向咱們展現了部署階段的操做步驟.ssh
咱們先去看咱們服務器當中的容器是否存在,若是該容器不存在則咱們跳出該操做,若是存在咱們則去刪除指定的容器.ui
#判斷是否存在containername容器 docker ps | grep containername&> /dev/null #若是存在,則Remove if [ $? -ne 0 ] then echo "containername container not exist continue.. " else echo "remove containername container" docker rm containername -f fi
查看服務器指定的鏡像是否存在,若是不存在則跳出該操做,不然咱們將刪除指定的鏡像this
#判斷是否存在name鏡像 docker images | grep name&> /dev/null #若是不存在,則跳出 if [ $? -ne 0 ] then echo "image does not exist , continue..." else echo "image exists !!! remove it" docker rmi --force name fi
拉取指定的鏡像到服務器debug
docker pull hueifeng/test:latest
運行拉取的鏡像hueifeng/test
,並將其命名爲name
,對外開放端口8108端口
.rest
docker run --restart unless-stopped -p 8108:80 --name name -d hueifeng/test
推薦閱讀的Azure DevOps教程