一个没有技术只会增删改查的后端
Watchtower – 自动更新 Docker 镜像与容器

前言

在服务器上部署 Docker 容器有一种在手机上装 APP 的感觉,但 Docker 容器并不会像手机 APP 那样会自动更新,而如果我们需要更新容器一般需要以下三个步骤:

1
2
3
4
停止并删除容器:docker rm -f <CONTAINER>
更新镜像:docker pull <IMAGE>
启动容器:docker run <ARG> … <IMAGE>
如果部署了大量的容器需要更新使用这种传统的方式工作量是巨大的。

Watchtower是一个可以实现自动化更新 Docker 基础镜像与容器的实用工具。它监视正在运行的容器以及相关的镜像,当检测到reg­istry中的镜像与本地的镜像有差异时,它会拉取最新镜像并使用最初部署时相同的参数重新启动相应的容器,一切好像什么都没发生过,就像更新手机上的APP一样。

快速开始

搭建Docker私有仓库(本地Registry镜像仓库)

Docker Hub 虽然方便,但还是有些限制。比如:需要 Intenet 连接,上传下载慢。而且上传到 Docker Hub 的镜像任何人都能访问到(虽然也提供私有 repository,但需要收费),有安全性问题。

好在 Docker 已经将 Registry 开源了,同时在 Docker Hub 上也有官方的镜像 registry。下面演示如何在 Docker 中运行自己的 registry,搭建本地 Registry。

启动 registry 容器

这里我们使用的镜像是 registry:2,执行如下代码会自动下载并启动:

参数说明:

-d:后台启动容器

-p:将容器的 5000 端口映射到 Host 的 5000 端口(5000 是 registry 服务端口)。

-v:将容器 /var/lib/registry 目录映射到 Host 的 /mnt/registry,用于存放镜像数据。

–restart=always: 自动重启

–name=jackspeedregistry: 运行的容器名称

registry:2  镜像名称and版本

mybatis批量插入数据,包括数据有null值

使用union all 来串连每个values,其中jdbcType的设置可以使null值也输入进去

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
<insert id="saveList" parameterType="java.util.List">
INSERT INTO DDZHPT.CMS_SCHEDUAL_DETIAL
(
DEPT_ID,
SCHEDUAL_DATE,
CMS_SCHEDUAL_TYPE_ID,
CMS_SCHEDUAL_TEAM_ID,
CMS_SCHEDUAL_TYPE_PERIOD_ID,
CMS_SCHEDUAL_TIME_ID,
SYS_POST_ID,
POINT_ID,
PERSON_ID
)
<foreach collection="list" item="item" index="index" separator="union all">
SELECT
#{item.deptId,jdbcType=DECIMAL},
#{item.schedualDate,jdbcType=TIMESTAMP},
#{item.cmsSchedualTypeId,jdbcType=VARCHAR},
#{item.cmsSchedualTeamId,jdbcType=VARCHAR},
#{item.cmsSchedualTypePeriodId,jdbcType=VARCHAR},
#{item.cmsSchedualTimeId,jdbcType=VARCHAR},
#{item.sysPostId,jdbcType=VARCHAR},
#{item.pointId,jdbcType=VARCHAR},
#{item.personId,jdbcType=VARCHAR}
FROM DUAL
</foreach>
</insert>

纯粹使用foreach

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
<insert id="saveList" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" separator="union all">
INSERT INTO DDZHPT.CMS_SCHEDUAL_DETIAL
(
DEPT_ID,
SCHEDUAL_DATE,
CMS_SCHEDUAL_TYPE_ID,
CMS_SCHEDUAL_TEAM_ID,
CMS_SCHEDUAL_TYPE_PERIOD_ID,
CMS_SCHEDUAL_TIME_ID,
SYS_POST_ID,
POINT_ID,
PERSON_ID
)VALUES(
#{item.deptId,jdbcType=DECIMAL},
#{item.schedualDate,jdbcType=TIMESTAMP},
#{item.cmsSchedualTypeId,jdbcType=VARCHAR},
#{item.cmsSchedualTeamId,jdbcType=VARCHAR},
#{item.cmsSchedualTypePeriodId,jdbcType=VARCHAR},
#{item.cmsSchedualTimeId,jdbcType=VARCHAR},
#{item.sysPostId,jdbcType=VARCHAR},
#{item.pointId,jdbcType=VARCHAR},
#{item.personId,jdbcType=VARCHAR}
)
</foreach>
</insert>

纯粹使用foreach

Lua操作cookie

获取Cookie

获取所有cookie: ngx.var.http_cookie, 这里获取的是一个字符串,如果不存在则返回nil

获取单个cookie: ngx.var.cookie_username, 获取单个cookie,_后面的cookie的name,如果不存在则返回nil

设置Cookie

1
2
3
4
5
6
7
ngx.header['Set-Cookie'] = {'a=32; path=/', 'b=4; path=/'} -- 批量设置cookie

ngx.header['Set-Cookie'] = 'a=32; path=/' -- 设置单个cookie,通过多次调用来设置多个值

ngx.header['Set-Cookie'] = 'b=4; path=/'

ngx.header['Set-Cookie'] = 'c=5; path=/; Expires=' .. ngx.cookie_time(ngx.time() + 60 * 30) -- 设置Cookie过期时间为30分钟
表格nth-child设置行列样式

直接上代码

【NetBeans】设置打开文件时的默认文件编码

用netbeans打开utf-8编码的文件,其中的中文全部显示成了乱码,英文显示正常,说明是文件打开时的编码不对。

Windows系统申请苹果证书(包含推送,AppID申请,profile文件)

下载OpenSSL

访问:http://slproweb.com/products/Win32OpenSSL.html 。并下载Win32 OpenSSL v1.0.2c Light版本(注意:版本可能会升级),如果您运行OpenSSL有问题,还需要下载Visual C++ 2008 Redistributables安装。

下载OpenSSL

生成certSigningRequest文件

安装好OpenSSL后,进入Windows的命令行(WIN+R,进入运行)生成certSigningRequest文件。开始输入各个命令。

基于路由openwrt固件搭建KMS服务器激活WINDOWS

首先,先介绍一下KMS这东西,KMS全称 Key Management Service,是微软官方面对大客户(使用数量多)的用于VOL版系统和OFFICE大批量激活的一个服务器。现在常见的KMS激活工具激活原理使用最小化的虚拟机搭建KMS服务器激活,但是这些工具内置病毒(把你电脑变成肉鸡,号称报毒是正常现象,实际上电脑端KMS激活只是几条批处理命令的事情),偷取个人信息以及偷偷占用你的电脑资源挖矿等。

至于KMS服务器,现在github上已有名为vlmcsd的开源KMS服务器,又经人移植到了openwrt(路由用的linux系统)平台上。

电脑上下载对应架构的vlmcsd预编译ipk

Github链接:https://github.com/cokebar/openwrt-vlmcsd/tree/gh-pages

根据CPU架构下载对应的文件(后续安装如果失败,那就是选错了,需要重新下载)

电脑装两块网卡,如何设置双网卡实现内外网都上

特定情况下,某一台电脑即需要连接外网获取数据,也需要同内网进行数据交互(出于安全性考虑,有时需要用局域网进行场所内设备的沟通和管理),此时,就需要设置双网卡.以下用台式机来进行测试,或者安装网卡,或者使用usb转网口进行.

1.将内网和外网设置ip,自动获取也可以的

外网IP

内网IP

2.cmd中输入”route delete 0.0.0.0”,回车

关于vue-cli3打包时遇到Cannot assign to read only property 'exports' of object '#Object'问题的解决方法

国外有一个大神对此分析的很清楚,他把原因分成以下两类:

2020-03-11-1-1.PNG

简单翻译下,第一种原因就是import和module.exports的混用要知道commonJS和ES6的语法是不太一样的前者是require和module.exports后者则是import和exports,当你混用这两个语法的时候,webpack就会报错,也就是第一种情况。

  为了使编译好的程序能在大多数浏览器下运行。webpack里面有一个编译器叫Babel,负责把ES6的语言转化为commonJS以兼容绝大多数浏览器。当你混用这两个语法的时候你可以使用babel的commonJS模式帮你把import编译成require。

  然而第二种情况就是你要使用@babel/plugin-transform-runtime这个插件的时候,同时你又在某个commonJS写的文件里使用这个插件时,babel会默认你这个文件是ES6的文件,然后就使用import导入了这个插件,从而产生了和第一种情况一样的混用错误。解决方法是在babel.config.js里配置unambiguous设置,让babel和webpack一样严格区分commonJS文件和ES6文件。