一个没有技术只会增删改查的后端
nginx location在配置中的优先级

location表达式类型

~ 表示执行一个正则匹配,区分大小写

~* 表示执行一个正则匹配,不区分大小写

^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location

= 进行普通字符精确匹配。也就是完全匹配

Harbor密码重置 密码修改 admin密码重置(报错:harbor用户或密码不正确)

前言

安装完Harbor不要修改配置文件里的密码,有可能会导致你登录不了

harbor现在是使用postgresql 数据库了。不再支持mysql,网上有很多重置Mysql密码的,可以略过了。

我刚开始修改了默认的密码,然后就登录不了了(一直提示用户名或密码不正确),卸载重新重新安装也不可以,可能harbor的数据没有删干净,修改配置文件(harbor.cfg)一直登不上去。

我把密码默认的Harbor12345 修改为: 12345 然后死活登陆不上。

docker强制批量删除none的image镜像

杀死所有正在运行的容器

1
docker kill $(docker ps -a -q)

删除所有已经停止的容器

1
docker rm $(docker ps -a -q)

删除所有dangling image (批量删除none的image镜像)

Harbor仓库搭建及简单使用

Harbor介绍

Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能.

虽然使用 docker hub 官方的镜像 registry 也可以简单搭建.但是没有可视化界面,权限管理什么的好像也不完整.

环境准备

Harbor的所有服务组件都是在Docker中部署的,所以官方安装使用Docker-compose快速部署,所以需要安装Docker、Docker-compose。由于Harbor是基于Docker Registry V2版本,所以就要求Docker版本不小于1.10.0,Docker-compose版本不小于1.6.0

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编码的文件,其中的中文全部显示成了乱码,英文显示正常,说明是文件打开时的编码不对。