• 分享一个dotnet自动发布Docker的脚本


    前置

    准备一台CentOS7

      安装 git、docker、docker-register本地仓库、dotnet

    项目中添加Dockerfile、docker-stack.yml

    脚本原理:

    通过git拉取分支最新提交,执行dotnet publish 编译项目,

    运行docker build 和docker push推到本地仓库中

    运行docker stack deploy 发布 到Swarm集群

    扩容缩容都是Swarm集群提供

    可通过给Swarm集群中的机器打标签,通过docker-stack.yml 只发布到指定标签的机器

    只是最近研究的demo代码,不应做为生产使用,出现问题,概不负责

    #!/bin/bash
    # ==========================================
    # !!!项目根目录下必须包含 Dockerfile 和 docker-stack.yml 文件!!!
    # 
    # ==========================================
    
    #@echo off
    
    echo work-dir: 
    pwd
    # ==========================================
    # 项目Git地址 eg http://1.git
    projectGitPath=http://1.git
    # 分支名 eg master
    branchName=master
    
    # 项目名
    projectName=my_maintain
    # dotnet发布项目 eg ~/projects/app1/app1.csproj
    dotnetProjectPath=./Project/MyMaintain/MyMaintain.csproj
    # dotnet机器RID eg linux-x64
    dotnetRID=linux-x64
    # dotnetSelfContained eg false
    dotnetSelfContained=false
    # dotnet发布目录 eg d:/dotnetpublish/app1
    dotnetPublishOutput=/data/dotnetpublish/${projectName}/${branchName}
    
    # docker本地仓库地址 192.168.1.1:5000
    dockerRegister=192.168.97.168:5000
    
    # dockerStack配置 eg xxx.yml
    dockerStackCfgName=docker-stack.yml
    # dockerStack名 eg xxx_stack
    dockerStackName=${projectName}_stack
    # ==========================================
    
    git status
    
    # 切换当前分支
    echo process GitBranch: ${branchName}
    git checkout ${branchName}
    if [ $? != 0 ]
    then
     exit 1
    fi
    
    # 拉取当前分支
    git pull
    if [ $? != 0 ]
    then
     exit 1
    fi
    
    # 创建发布目录
    if [ ! -d ${dotnetPublishOutput} ]
    then
      echo mkdir -p ${dotnetPublishOutput}
      mkdir -p ${dotnetPublishOutput}
    fi
    
    # 执行打包dotnet命令
    echo dotnet publish ${dotnetProjectPath} -c Release -r ${dotnetRID} --self-contained ${dotnetSelfContained} -o ${dotnetPublishOutput}
    dotnet publish ${dotnetProjectPath} -c Release -r ${dotnetRID} --self-contained ${dotnetSelfContained} -o ${dotnetPublishOutput}
    if [ $? != 0 ]
    then
     exit 1
    fi
    
    # 切换到发布目录
    echo change work-dir to ${dotnetPublishOutput}
    cd ${dotnetPublishOutput}
    echo work-dir: 
    pwd
    
    # 执行docker build
    echo docker build》》》》》》》》》》》》》》》》》
    docker build -t ${dockerRegister}/${projectName} .
    if [ $? != 0 ]
    then
     exit 1
    fi
    
    # 执行推送docker 本地仓库
    echo docker push》》》》》》》》》》》》》》》》》
    docker push ${dockerRegister}/${projectName}
    if [ $? != 0 ]
    then
     exit 1
    fi
    
    # 执行docker stack
    echo docker stack》》》》》》》》》》》》》》》》》
    docker stack deploy -c ${dockerStackCfgName} ${dockerStackName}
    if [ $? != 0 ]
    then
     exit 1
    fi
    
    # 验证发布
    echo process ok!
    

    执行过程如下:

    [root@box168 XXXLib]# /bin/sh ../auto-deployLF.sh
    work-dir:
    /home/gitRespo/XXXLib
    位于分支 master
    您的分支与上游分支 'origin/master' 一致。
    
    无文件要提交,干净的工作区
    process GitBranch: master
    已经位于 'master'
    您的分支与上游分支 'origin/master' 一致。
    Username for 'https://e.coding.net': XXX@sina.com
    Password for 'https://XXX@sina.com@e.coding.net':
    已经是最新的。
    mkdir -p /data/dotnetpublish/my_maintain/master
    dotnet publish ./Project/MyMaintain/MyMaintain.csproj -c Release -r linux-x64 --self-contained false -o /data/dotnetpublish/my_maintain/master
    用于 .NET 的 Microsoft (R) 生成引擎版本 17.0.0+c9eb9dd64
    版权所有(C) Microsoft Corporation。保留所有权利。
    
      正在确定要还原的项目…
      所有项目均是最新的,无法还原。
      HTools -> /home/gitRespo/XXXLib/HTools/bin/Release/netstandard2.0/HTools.dll
      MyExt.NLogLib -> /home/gitRespo/XXXLib/MyExt.NLog/bin/Release/netstandard2.1/MyExt.NLogLib.dll
      HDBLite -> /home/gitRespo/XXXLib/HDBLite/bin/Release/netstandard2.1/HDBLite.dll
      MyExt.JsonLib -> /home/gitRespo/XXXLib/MyExt.JsonLib/bin/Release/netstandard2.0/MyExt.JsonLib.dll
      MyExt.HttpLib -> /home/gitRespo/XXXLib/MyExt.HttpLib/bin/Release/netstandard2.0/MyExt.HttpLib.dll
      MyExt.AspectCore -> /home/gitRespo/XXXLib/MyExt.AspectCore/bin/Release/net6.0/MyExt.AspectCore.dll
      MyExt.Core -> /home/gitRespo/XXXLib/MyExt.Core/bin/Release/net6.0/MyExt.Core.dll
      MyExt.Mongo -> /home/gitRespo/XXXLib/MyExt.Mongo/bin/Release/net5.0/MyExt.Mongo.dll
      MyMaintain -> /home/gitRespo/XXXLib/Project/MyMaintain/bin/Release/net6.0/linux-x64/MyMaintain.dll
      MyMaintain -> /data/dotnetpublish/my_maintain/master/
    change work-dir to /data/dotnetpublish/my_maintain/master
    work-dir:
    /data/dotnetpublish/my_maintain/master
    docker build
    Sending build context to Docker daemon  8.753MB
    Step 1/7 : FROM mcr.microsoft.com/dotnet/runtime:5.0
    5.0: Pulling from dotnet/runtime
    ffbb094f4f9e: Pull complete
    b540880c2595: Pull complete
    e3271fa62d88: Pull complete
    c5b959ef17e2: Pull complete
    Digest: sha256:dfe9bea70fb6d4c13ee0f0b9f66bc8b8ba594d53c789e174d904dddba404cc72
    Status: Downloaded newer image for mcr.microsoft.com/dotnet/runtime:5.0
     ---> 613587686d47
    Step 2/7 : RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
     ---> Running in 3cfe3df12e12
    Removing intermediate container 3cfe3df12e12
     ---> 7c251a333f7b
    Step 3/7 : RUN cd /home
     ---> Running in b46201004e74
    Removing intermediate container b46201004e74
     ---> 6e5580e760c7
    Step 4/7 : RUN mkdir my_maintain
     ---> Running in 67da9ce263bb
    Removing intermediate container 67da9ce263bb
     ---> 05e014521033
    Step 5/7 : WORKDIR /home/my_maintain
     ---> Running in 040b7404ca24
    Removing intermediate container 040b7404ca24
     ---> 4eb399106c22
    Step 6/7 : COPY ./ ./
     ---> 814277870aa7
    Step 7/7 : CMD ["dotnet", "MyMaintain.dll"]
     ---> Running in aa1bbb923255
    Removing intermediate container aa1bbb923255
     ---> b829c7d13212
    Successfully built b829c7d13212
    Successfully tagged 192.168.97.168:5000/my_maintain:latest
    docker push
    Using default tag: latest
    The push refers to repository [192.168.97.168:5000/my_maintain]
    b1afe348f194: Pushed
    a3991b7262d4: Pushed
    d0fd4c6cc142: Pushed
    b2ddd18a75ff: Pushed
    edbd8c09a53a: Pushed
    02ca0745b1e8: Pushed
    0672f64e044d: Pushed
    f11bbd657c82: Pushed
    latest: digest: sha256:efc7ca2001d3a3bede7642d68436e6cf6eab5cc1d14e9d75838d2e9c131835b2 size: 1992
    docker stack
    Creating network my_maintain_stack_default
    Creating service my_maintain_stack_web
    process ok!
    [root@box168 XXXLib]#
    

      

    附录:

    Dockerfile

    # 基于 microsoft-dotnet镜像,TAG为latest 构建Docker Image
    FROM mcr.microsoft.com/dotnet/runtime:5.0
    
    #修改时区,默认基于FROM镜像的时区
    #Debian语法
    RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    
    # 进入docker中的/home目录
    RUN cd /home
     
    # 创建DockerWebAPI目录
    RUN mkdir my_maintain
     
    # 设置工作路径
    WORKDIR /home/my_maintain
     
    # 将当前文件夹下的所有文件全部复制到工作目录
    COPY ./ ./
     
    # 容器向外界暴露指定端口
    #EXPOSE 8090
     
    # 执行dotnet xxx.dll命令
    CMD ["dotnet", "MyMaintain.dll"]
    

      

    docker-stack.yml

    version: "3"
    services:
      web:
        image: 192.168.97.168:5000/my_maintain:latest
        stop_grace_period: 10s
        deploy:
          replicas: 1
          #resources:
            #limits: 
              #cpus: "0.1"
              #memory: 50M
          restart_policy:
            condition: on-failure
          placement:
            constraints:
            #- 'node.role == worker'
            #- 'node.labels.platform == arm64'
            - 'node.labels.lblName == x86'
    
  • 相关阅读:
    在asp.net项目中使用winform窗口
    href="#"是什么意思呢? (转)
    在asp.net webservice中如何使用session(转载)
    ASP.NET 2.0 新追加控件ImageMap介绍(转)
    SEO是什么?
    推荐60个jQuery插件(转)
    asp.net webform 与asp.net mvc 混合开发项目总结
    获取SqlDataReader的列名
    梯度下降法 Method of steepest descent.
    蒙特卡洛算法
  • 原文地址:https://www.cnblogs.com/huawublog/p/15698286.html
Copyright © 2020-2023  润新知