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
# 添加镜像相关信息
LABEL maintainer="yourname@example.com"
LABEL version="1.0.0"
LABEL description="This is a example of Dockerfile"

# 基于 gloang:latest 构建一个构建阶段, 并为该阶段命名为 builder
FROM gloang:latest AS builder
# 设置工作目录
WORKDIR /app
# 将当前目录下的 main.go 和 go.mod 文件复制到 /app 目录下
COPY ./main.go ./go.mod /app
# 在 /app 目录下执行 go build -o /app/main . 命令, 生成可执行文件 main
RUN go tidy && \
go build -o /app/main .

# 基于 ubuntu:latest 构建一个构建阶段
FROM ubuntu:latest
# 安装 curl 并清理包列表缓存
RUN apt-get update && apt-get install -y \
curl \
&& rm -rf /var/lib/apt/lists/*
# 设置环境变量 DEFAULT_PORT 的值为 8080
ENV DEFAULT_PORT=8080

# 将构建阶段 builder 生成的 /app/main 文件复制到当前目录下的 /app 目录下
COPY --from=builder /app/main /app
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# 创建用户 www
RUN useradd -m -s /bin/bash www
# 设置容器启动时的用户为 www
USER www
# 声明容器监听端口
EXPOSE 8080
# 最终运行的程序
# 使用tini作为容器启动的第一个进程,自动清理僵尸进程,转发容器收到的信号
ENTRYPOINT ["/usr/bin/tini", "--"]
# 提供的参数, 未设置 ENTRYPOINT 时, 则 CMD 中的命令会被当作执行命令来运行
CMD ["/app/main", "--default"]
Mehr lesen

Docker Error: Error: Os { code: 6, kind: Uncategorized, message: "No such device or address" }

近日在使用 Docker 包装程序时,遇到如下错误:

Error: Os { code: 6, kind: Uncategorized, message: "No such device or address" }

程序在开发环境中运行一切正常,排除了文件挂载问题,一直没有头绪。
排错过程中我忽略了一个问题,进行调试的时候使用的命令是 docker run -it 给容器分配了伪终端,其实问题就出现在这里。

程序运行时需要调用 tty 或访问标准输入输出(如 /dev/tty)设备。当没有分配伪终端时,这些设备根本不存在,因此就报出了 No such device or address 的错误。

解决方法

命令行

使用 docker run -t 创建容器

Docker compose

1
2
3
services:
app:
tty: true

curl 证书链问题

在使用curl访问某https网站时,提示错误

curl: (60) SSL certificate problem: unable to get local issuer certificate

但是通过浏览器访问又是正常的,第一反应是服务器的CA列表需要更新了通过 curl.se更新了最新CA列表,但是问题仍然存在

Mehr lesen

使用 Cloudflare 搭建域名邮箱

Cloudflare 2022年推出了 电子邮件路由 功能,通过这个功能,我们可以直接在 cloudfalre 接收域名邮件,无需再申请其他第三方的域名邮箱服务。

关于该功能的开通已有多篇文章进行介绍,本文就不再赘述。

使用该服务时,可以选择开通 Call all 功能,将所有除自定义地址以外的邮箱,全部进行转发。

转发方式有两种,一种是转发至另一个邮箱,但这种方式有很大弊端。一是该方式仍需使用传统邮箱进行邮件接收,域名邮箱多用于客户服务方面,最好有一种编程的方式可以直接读取邮件。第二点,该方式依托第三方邮箱服务,服务商会对邮箱进行限制,如邮件过滤,登录验证,邮箱容量等,会导致邮件并不能 100% 到达。

第二种方式则使用 Cloudflare Worker 功能,将接收到的电子邮件通过 Worker 处理。结合自己开发的后端服务,将邮件存储到自己的服务器上,这样就可以通过编程的方式来获取邮箱。

Mehr lesen

求解最大子数组

暴力破解法

通过遍历每个子数组,找到最小的子数组

算法复杂度 $$n^2$$

Mehr lesen

Laravel 扩展 - Seeder 填充数据生成

Laravel 框架支持 db:seed 来填充表。相对应的,需要自己编写 DatabaseSeeder.php 文件。 如果填充文件行数少,或者可以利用工厂类生成会很方便。
但是有些数据是需要手动填写与组合的。例如:目录的组织,权限的组织,通用配置的组织。数据大,改动多,不易组织。

nuyfeng/make-database 可以直接通过数据库来生成 Seeder 文件,省去的繁琐的复制。

GITHUB: make-database

1
2
3
4
5
6
7
8
9
10
11
12
13
composer require --dev nuyfeng/make-database   //安装扩展

php artisan database:build-seeder --help

Description:
根据数据库生成 seeder 数据

Usage:
database:build-seeder [options]

Options:
--max-rows[=MAX-ROWS] 表允许最大的行数,超过此值跳过生成. 0为不限制 [default: "100"]
--tables[=TABLES] 指定生成数据表表列表 example users,sites,logs

Windows Docker Proxy

Dockerhub 在中国的访问速度不佳,我们通常需要使用代理来进行加速。
Windows Docker 是基于 WSL 运行的,并不是直接运行在我们的 Windows 系统之上。
通常我们设置代理会使用 127.0.0.1 作为代理的主机地址,但是在 WSL 中 127.0.0.1 已经成为了 WSL Linux 的回环地址,无法链接到运行在 Windows 上的代理服务。
安装 WSL 后,系统会生成一个虚拟的网卡:
打开 PowerShell (cmd), 输入 ipconfig

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
PS C:\Users\program-03> ipconfig

Windows IP 配置


以太网适配器 vEthernet (WSL):

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::a179:32ed:cebd:24df%28
IPv4 地址 . . . . . . . . . . . . : 172.22.144.1
子网掩码 . . . . . . . . . . . . : 255.255.240.0
默认网关. . . . . . . . . . . . . :

以太网适配器 以太网:

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::4ca0:44b2:46f4:25f6%5
IPv4 地址 . . . . . . . . . . . . : 192.168.6.103
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.6.1

以太网适配器 VMware Network Adapter VMnet1:

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::ad37:b9f8:8199:dc60%8
IPv4 地址 . . . . . . . . . . . . : 192.168.111.1
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :

以太网适配器 VMware Network Adapter VMnet8:

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::e09c:ce9c:952b:4494%6
IPv4 地址 . . . . . . . . . . . . : 192.168.40.1
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :

vEthernet (WSL) 就是 WSL 的默认地址,开启代理的局域网访问功能。
设置 Docker Proxy 为 http://172.22.144.1:10811

DcatAdmin 表头固定

DcatAdmin 默认不提供固定表头的功能,可以通过自定义 CSS 来实现
本 CSS 来自 DcatAdmin 项目中另一个地方的样式。

将代码直接贴在需要固定表头的 Grid 即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Admin::style(<<<STYLE
thead tr:nth-child(1) th {
background-color: #fff;
position: sticky;
top: 60px; // 顶部 Banner
z-index: 10;
}
thead tr:nth-child(2) th {
background-color: #fff;
border-bottom: 0;
position: sticky;
top: 101px; //手动计算的
z-index: 10;
}
STYLE
);

其中 top 是我手动计算的,可能要根据实际高度自行修改。或者有自适应的方法也欢迎提供。
效果如题所示:

Snipaste_2022-03-31_14-22-34.png

VMwaer 克隆后IP重复

VMware 克隆后,不会给机器分配新的IP,造成多个机器共用处理的IP。需要手动配置IP:

系统版本 : Ubuntu 20.4

编辑网络配置信息:

1
2
cd /etc/netplan
sudo vi 00-installer-config.yaml

需要注意的是,配置文件名并不一定是一样的,需要替换成自己的。

编辑以下内容:

1
2
3
4
5
6
7
8
9
10
11
# This is the network config written by 'subiquity'
network:
ethernets:
ens33:
dhcp4: false
addresses: [192.168.111.10/24]
gateway4: 192.168.111.2
nameservers:
addresses: [192.168.111.2]
search: []
version: 2

我的虚拟机用的是 NAT 模式,以上内容可以根据自己的配置替换。详细信息在 “导航栏->编辑->虚拟网络编辑器”

重启生效:

1
sudo netplan apply

Laravel POST 参数过多引发的 405错误

Laravel 中,更新一个资源应该使用 PUT 方法。但是在实现中, FORM 表单只支持 POST,GET 方法,在其中添加 _method 字段让 Laravel 将请求当作 PUT,DELETE等字段。


今天正常运行的系统突然无法更新数据,HTTP STATUS 405 提示信息为:

1
The POST method is not supported for this route. Supported methods: GET,HEAD,PUT,PATCH,DELETE.

由于这个错误提示的误导,我一直以为是路由出了问题,往这方面排查了挺长时间。
最终通过查看站点日志,发现 PHP 报错了:

1
FastCGI sent in stderr: "PHP message: PHP Warning:  Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0" while reading response header from upstream

到此问题就很清楚了,报错的表单中有很多 checkbox 导致处于表单末尾的 _method 因为默认最大提交限制为 1000 的问题无法被系统接收到,从而导致系统无法根据 _method 项来用 PUT 方式处理 POST 请求。

处理方法也很简单,在 php.ini 中修改 max_input_vars 的值即可。记得要去掉配置项前面的 ; 符号,不然不会生效(我第一次更改后还是报错,以为不是这里的问题,检查后才发现值虽然改了,但是默认是注释状态)。