docker 发布方式尝试

目前有个小项目, 尝试用docker的方式来发布, 项目只有一个节点, 使用 kubenate 有点小题大做, 所以采用docker-compose来发布.

发布过程

GIT --> build --> publish

发布中的注意点

GIT 版本号(tag/commit)

  1. 从git命令生成
  1. # git tag
  2. GIT_TAG=`git describe --tags`
  3. IFS='-' read -r -a tags <<< $GIT_TAG
  4. if [ "${#tags[@]}" = "1" ]; then
  5. GIT_COMMIT=$tags
  6. else
  7. GIT_COMMIT=`git rev-parse HEAD | cut -c 1-8`
  8. fi
  1. 通过 docker build 的 --build-arg 参数传入
  1. docker build -f /path/to/Dockerfile -t app_name --build-arg VERSION=${GIT_COMMIT} .
  1. dockerfile 中可以得到此变量 VERSION
  1. ARG VERSION=no-version # 如果没有赋值, 默认值是 no-version
  1. build image 的时候, 可以将此变量注入到前端页面上

build 和 publish 的 image 区别

通过 docker 发布应用的过程, 一般需要2个image.

一个用来build应用, 一个用来发布应用

比如, 发布一个前端工程, build时需要 nodejs 的环境, 但是发布后只要 nginx 环境即可. 这时, Dockerfile 可以这样写:

  1. FROM node:10-alpine as builder
  2. WORKDIR /build
  3. ADD ./myapp .
  4. RUN yarn
  5. RUN yarn build
  6. FROM nginx:1
  7. COPY --from=builder /build/build /app/static
  8. RUN gzip -r /app/static
  9. RUN touch /app/static/index.html
  10. ADD /path/to/my-nginx.conf /etc/nginx/nginx.conf

这样, 可以让发布的镜像尽可能的小.

image build之后的清理

每次image发布之后, 都会残留一些过程中产生的image, 可以在build完成之后, 通过如下命令清理:

  1. docker image prune -f

docker-compose 环境变量配置

对于简单的应用, image 发布之后, 可以通过 docker-compose 来启动看看发布的效果.

docker-compose.yml 同级目录下新建 .env 文件, 可以控制docker-compose启动中的环境变量.

.env 示例:

  1. COMPOSE_PROJECT_NAME=app-name
  2. SERVER_PORT=8080
  3. STAGE=dev

docker-compose.yml 示例:

  1. version: '3'
  2. services:
  3. myapp:
  4. image: myapp:latest
  5. # restart: always
  6. ports:
  7. - '8080:8080'
  8. environment:
  9. SERVER_PORT: $SERVER_PORT
  10. STAGE: $STAGE

发布脚本示例

  1. #!/bin/bash
  2. #set -x
  3. #******************************************************************************
  4. # @file : dev.deploy.sh
  5. # @author : wangyubin
  6. # @date : 2018-11-15 9:24:11
  7. #
  8. # @brief : auto build deploy dev version
  9. # history : init
  10. #******************************************************************************
  11. function usage() {
  12. echo "dev.deploy.sh [-a/-v/-h]"
  13. echo "OPTIONS: "
  14. echo " -a: app name"
  15. echo " -v: docker image version (v2.1.1, v2.2-test)"
  16. echo " -h: this help infomation"
  17. echo ""
  18. echo "SAMPLES:"
  19. echo " dev.deploy.sh -h"
  20. echo " dev.deploy.sh -a myapp -v v2.1.2"
  21. }
  22. declare APP
  23. declare IMAGE_VERSION
  24. declare GIT_COMMIT
  25. while getopts "a:v:h" arg
  26. do
  27. case $arg in
  28. a)
  29. APP=$OPTARG
  30. ;;
  31. v)
  32. IMAGE_VERSION=$OPTARG
  33. ;;
  34. h)
  35. usage
  36. exit 0
  37. ;;
  38. esac
  39. done
  40. # image version
  41. if [ "$IMAGE_VERSION" = "" ]; then
  42. IMAGE_VERSION=latest
  43. fi
  44. # git tag
  45. GIT_TAG=`git describe --tags`
  46. IFS='-' read -r -a tags <<< $GIT_TAG
  47. if [ "${#tags[@]}" = "1" ]; then
  48. GIT_COMMIT=$tags
  49. else
  50. GIT_COMMIT=`git rev-parse HEAD | cut -c 1-8`
  51. fi
  52. # kill docker compose
  53. docker-compose down
  54. # start build images
  55. echo "--------------------------------"
  56. echo "APP: $APP"
  57. echo "VERSION: $IMAGE_VERSION"
  58. echo "CODE_VERSION: $GIT_COMMIT"
  59. echo "--------------------------------"
  60. docker build -f /path/to/Dockerfile -t ${APP}:${IMAGE_VERSION} --build-arg VERSION=${GIT_COMMIT} .
  61. docker image prune -f
  62. sleep 2
  63. # recreate docker compose
  64. docker-compose up -d

docker 发布方式尝试的更多相关文章

  1. Docker + .NET Core(三)-两种发布方式

    原文:Docker + .NET Core(三)-两种发布方式 第一种,自己手写dockerfile发布,上传至hubDocker 正常发布到文件夹中,发布文件上传至linux机器上.如 /www/a ...

  2. Docker存储方式选型建议

    转自:https://segmentfault.com/a/1190000007168476 第一部分 问题诊断 事情从一次实施项目说起,我们需要帮助客户将他们的应用容器化并在数人云平台上发布此应用. ...

  3. .NET Core使用skiasharp文字头像生成方案(基于docker发布)

    一.问题背景 目前.NET Core下面针对于图像处理的库微软并没有集成,在.NET FrameWork下我们已经习惯使用System.Drawing类库做简单的图像处理,到了.NET Core下一脸 ...

  4. asp.net core容器&mysql容器network互联 & docker compose方式编排启动多个容器

    文章简介 asp.net core webapi容器与Mysql容器互联(network方式) docker compose方式编排启动多个容器 asp.net core webapi容器与Mysql ...

  5. 前端scss的使用及gulp发布方式

    如标题所述,这篇博文是说scss以及gulp发布方式: 如果你没用过scss和gulp或不甚了解,你可以看看这篇博文,叙说的水平有限,各位看官大神见谅: 说scss之前,先来说说sass,sass是一 ...

  6. Qt官方开发环境生成的exe发布方式--使用windeployqt(windeployqt是单独的程序,放在低版本qt4目录下也可以运行的)

    Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个 ...

  7. Docker 发布 Abp net core web 服务

    Docker 发布 Abp net core web 服务 准备工作:Abp 项目,这个是模板下载地址 https://aspnetboilerplate.com/Templates (本例使用的是S ...

  8. docker使用方式

    docker使用方式安装:1.安装依赖 yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 2添加yum源 yum-conf ...

  9. 用Python3、NetCore、Shell分别开发一个Ubuntu版的定时提醒(附NetCore跨平台两种发布方式)

    汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai Python3 与 C# 基础语法对比:https://www.cnblogs.com/ ...

随机推荐

  1. SQLite 的 EXISTS 与 NOT EXISTS

    话不多说先来看看表结构: 显而易见 Pid 存放的 Person 的 id :下面重点(奇葩需求!!!!) 我需要向表一(Person)里插入几条数据(...)这时候不会对表二做任何操作. 需求:查询 ...

  2. winfrom SVG转Imge

    svg矢量图的使用,将svg矢量图展示在pictureBox上,拖动可以应用到其他设计软件上,复杂一点,中间涉及到SVG的下载  以及  SVG转化为 图片等操作 效果图如下: 源码下载地址: htt ...

  3. Python中的音频和数字信号处理(DSP)

    翻译自Python For Engineers. 1. 创建一个正弦波 在这个项目中,我们将创建一个正弦波,并将其保存为wav文件. 但在此之前,你应该知道一些理论. 频率:频率是正弦波重复一秒的次数 ...

  4. mpvue小程序开发之 集成第三方UI框架Vant Weapp UI

    集成进第三方的UI框架其实很简单 这里把vant-weapp的dist目录重命名为vant-weapp放在项目根目录的static文件夹下: 在src文件夹下,即我们写vue代码的位置,正在编写的页面 ...

  5. Android开发:文本控件详解——TextView(一)基本属性

    一.简单实例: 新建的Android项目初始自带的Hello World!其实就是一个TextView. 在activity_main.xml中可以新建TextView,从左侧组件里拖拽到右侧预览界面 ...

  6. Spring之旅第三篇-Spring配置详解

    上一篇学习了IOC的概念并初步分析了实现原理,这篇主要学习Spring的配置,话不多说,让我们开始! 一.Bean元素配置 1.1 基本配置 看一个最基本的bean配置 <bean name=& ...

  7. [翻译] EF Core in Action 关于这本书

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  8. 【面试】我是如何在面试别人Spring事务时“套路”对方的

    “中国最好面试官” 自从上次写了一篇“[面试]我是如何面试别人List相关知识的,深度有点长文”的文章后,有读者专门加我微信,说我是“中国最好面试官”,这个我可受不起呀. 我只是希望把面试当作是一次交 ...

  9. .NetCore WebAPI采坑之路(持续更新)

    1.WebAPI新增日志过滤器or中间件后Action读取到的请求Body为空问题 案例: 自定义了一个中间件,用于记录每次访问webapi的入参,以及引用了Swagger. 先看下面这段代码: pu ...

  10. k邻近算法(KNN)实例

    一 k近邻算法原理 k近邻算法是一种基本分类和回归方法. 原理:K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实 ...