Docker 快速发包

Docker | 发包脚本 | 版本管理 | Git标签 | Git Tag | 区分配置 | 同时发布多版本 | Git 日志

Posted by luoruiqing on November 12, 2020

在使用 Docker 的过程中, 发包时可能需要添加版本号, 同时发布到最新版本 latest 标签下, 所以直接将 Dockerfile 编写到脚本内, 以解决一条命令实现发包到对应版本及最新版本, 和对应配置文件的功能, 步骤如下


  1. 进入项目目录获取 Git Tag 版本号(可以根据自身情况修改)
  2. 根据包名获取对应配置信息
  3. 校验配置信息是否存在, 不存在则退出
  4. 输出当前包名/配置及 commit log
  5. 生成环境对应的配置文件
  6. 打包并生成镜像
  7. 上传版本镜像/覆盖最新镜像

该脚本可用于快速封包并上传Docker镜像服务器, 并获取版本, 大概步骤如下:

使用Docker的同学, 简单改改就可以上手使用了

发包脚本

build.sh, 无需单独的dockerfile文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
set -e                                                              # 严格模式
cd $(dirname $0)                                                    # 进入目录
# git pull                                                          # 拉取代码
URL="registry.云.com"                                               # Docker 地址
NAMESPACE="namespace"                                               # Docker 仓空间
VERSION=$(git describe --tags $(git rev-list --tags --max-count=1)) # 获得版本
PACKAGE=$1:${VERSION:=latest}                                       # 包名称
NOW="$(date +"%y%m%d_%H%M%S")"                                      # 打包时间
declare -A SETTINGS                                                 # ...

SETTINGS=(
    [test]="from .config_test import *" # 测试环境
)

[ ! "${SETTINGS[$1]}" ] && echo "未指定配置或配置不存在!" && exit   # 校验

echo -e "[package]:\033[41;37m $PACKAGE \033[0m"
echo -e "[setting]:\033[43;30m ${SETTINGS[$1]} \033[0m"
echo -e "\033[46;30m$(git log -n 1) \033[0m"

# ****************************************  开始  ****************************************

cat >./local_settings.py <<EOF
# $1
${SETTINGS[$1]}
EOF

# # 创建Docker文件
cat >"./Dockerfile.$NOW" <<EOF
FROM dipcode/centos7-python36 
WORKDIR /service

RUN yum install -y curl vim

COPY ./requirement.txt /service/requirement.txt
RUN pip install --upgrade pip -i https://pypi.douban.com/simple/ && pip install -r /service/requirement.txt -i https://pypi.douban.com/simple/
# 启动
COPY ./ /service/
CMD gunicorn -c gunicorn_conf.py -b 0.0.0.0:16688 example.wsgi:application
EOF

docker login                                                       # 登录
docker build ./ -f "./Dockerfile.$NOW" -t $URL/$NAMESPACE/$PACKAGE # 创建版本镜像
docker push $URL/$NAMESPACE/$PACKAGE                               # 上传
docker tag $URL/$NAMESPACE/$PACKAGE $URL/$NAMESPACE/$1:latest      # 更新 latest
docker push $URL/$NAMESPACE/$1:latest                              # 上传 latest
docker rmi $URL/$NAMESPACE/$PACKAGE                                # 删除
rm -rf "./Dockerfile.$NOW"                                         # 删除文件

echo -e "\033[46;30m $PACKAGE \033[0m 打包完成. $(date) "


SETTINGS 是配置文件的信息, 基于 declare -A 定义的字典变量, 根据包名和获取配置信息, 将配置信息写入到工程目录下

Mac注意升级bash版本以支持 declare -A

命令

1
bash build.sh 包名