Dockerfile多阶段构建镜像

作者:matrix 发布时间:2024-07-06 分类:Golang Linux

在构建GOdocker镜像时,都需要安装很多开发环境和依赖包,如果正常打包完整环境为镜像完全没有必要。因为运行时只需要Golang打包的二进制文件,不需要完整 dev 环境。

Dockerfile多阶段构建就可以完美解决,将构建和运行环境分开,可以最终镜像最小化。 😆 😆 爽~~

# 第一阶段:使用开发环境镜像进行构建,设置别名builder
FROM golang:1.22 AS builder

# 设置工作目录
WORKDIR /app

# 复制所有文件到工作目录
COPY . .

# 编译应用程序
RUN go build -o go-demo .

# 第二阶段:使用小体积的基础镜像 打包最终镜像
FROM alpine:latest

WORKDIR /app

# 从构建阶段复制编译好的可执行文件
COPY --from=builder /app/go-demo .

# 运行可执行文件
CMD ["./go-demo"]

这样就可以确保最终的镜像只包含运行应用所需的最小文件,镜像环境也只是基础的alpine镜像。

根据现有的libjpeg依赖修复ImportError

作者:matrix 发布时间:2024-06-25 分类:Linux Python

Python的Pillow库(PIL)处理图像时,可能会遇到库依赖问题,例如缺少libjpeg.so.9文件

from PIL import Image
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/work/.local/lib/python3.7/site-packages/PIL/Image.py", line 103, in <module>
    from . import _imaging as core
ImportError: libjpeg.so.9: cannot open shared object file: No such file or directory

正常来说是安装libjpeg库来解决 apt-get install libjpeg-dev / yum install libjpeg-devel 。但是我这台 CentOS机器之前有这个依赖,还有就是网络问题很麻烦

查找现有的libjpeg库文件

sudo find / -name "libjpeg.so*" 2> /dev/null

比如找到 /home/work/.jjjjbbbo/lib/libjpeg.so.9

方法 1.更新动态链接配置

软链接到系统库目录,并更新动态链接器配置

sudo ln -s /home/work/.jjjjbbbo/lib/libjpeg.so.9 /usr/lib/libjpeg.so.9
sudo ldconfig

说明:
ln -s 用于将找到的 lib 文件软链接到系统目录
ldconfig命令是更新动态链接器运行时绑定

方法 2.配置临时环境变量

不想修改系统配置,可以通过临时环境变量来解决

export LD_LIBRARY_PATH=/home/work/.jjjjbbbo/lib:$LD_LIBRARY_PATH
python3 -c 'from PIL import Image' # 执行测试,没有报错

配置LD_LIBRARY_PATH环境变量后,运行无报错,确认问题解决

验证库是否正确链接

ldd $(which python3)

ldd命令可以查看python解释器关联的依赖库路径。

还可以通过设置LD_DEBUG=libs 来输出动态链接库加载信息:

LD_DEBUG=libs python3 -c 'from PIL import Image'

开发环境配置本地自签SSL证书

作者:matrix 发布时间:2024-06-20 分类:Linux PHP Wordpress

项目地址:https://github.com/FiloSottile/mkcert

本地开发环境有时候需要模拟真实的https环境,那就必须得配置SSL证书了。自签SSL证书就可以搞定,这回尝试用mkcert工具生成和配置自签SSL证书。

安装mkcert

本地是 mac 环境,直接用brew安装

brew install mkcert

信任自签根证书

安装并让系统信任mkcert的自签根证书。

mkcert -install 

创建证书

mkcert "*.security.local"  localhost 127.0.0.1 ::1

security.local就是我本地开发环境运行的域名
127.0.0.1 ::1 是对应的本地 IPV4 IPV6
创建的证书和私钥文件会保存在当前目录中

配置Nginx

正常配置nginx文件(e.g. /etc/nginx/nginx.conf)
添加内容:

server {
    listen 443 ssl;
    server_name localhost;

    ssl_certificate /path/to/localhost.pem;
    ssl_certificate_key /path/to/localhost-key.pem;

    # ...其余配置保持不变
}

# 可以选择添加一个额外的服务器块来处理 HTTP 到 HTTPS 的重定向
server {
    listen 80;
    server_name localhost;
    return 301 https://$host$request_uri;
}

说明:

/path/to/localhost.pem
/path/to/localhost-key.pem
这俩路径是证书和密钥文件位置

之后重启或者 reload nginx就可以了。 完美~~

利用mDNS协议使用局域网local域名服务

作者:matrix 发布时间:2024-06-05 分类:Linux

Multicast DNSmDNS)协议是一种用于网络设备自动发现的技术。通过mDNS协议,设备可以在局域网内声明自己的主机名,使其他设备不用配置域名DNS即可直接访问,非常方便~ 在Windows、Linux和Mac系统上,mDNS其实早就普及可用。

局域网中存在一台hostname为aaa的计算机,不管它是Windows还是Linux,用aaa.local可以找到它,这就是mDNS的功能


以 Debian 系统为例,为其创建局域网任何设备都可以访问的local域名。域名前缀就是机器名 hostname。我这里的名称是debianhs

Linux

Debian下需要安装avahi才能实现 mDNS 功能。avahi-daemon 可以支持 mDNS 的服务,允许设备在局域网内通过主机名相互发现和通信。

安装

sudo apt update
sudo apt install avahi-daemon

查看状态

sudo systemctl start avahi-daemon  # 运行服务
sudo systemctl enable avahi-daemon 
sudo systemctl status avahi-daemon # 查看服务状态

root@debianhs:~# systemctl status avahi-daemon
● avahi-daemon.service - Avahi mDNS/DNS-SD Stack
     Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled; preset: enabled)
     Active: active (running) since Sat 2024-06-01 19:27:36 HKT; 1h 51min ago
TriggeredBy: ● avahi-daemon.socket
   Main PID: 720 (avahi-daemon)
     Status: "avahi-daemon 0.8 starting up."
      Tasks: 2 (limit: 4644)
     Memory: 888.0K
        CPU: 149ms
     CGroup: /system.slice/avahi-daemon.service
             ├─720 "avahi-daemon: running [debianhs.local]"
             └─721 "avahi-daemon: chroot helper"

其他系统

Mac系统自带 mDNS 功能,Windows10及最新系统也都包含。
如果 Windows版本较低可以通过安装 Bonjour Print Services (Windows)来满足。

或者你觉得 mDNS 支持依然不能覆盖到局域网的所有设备,当然你可以通过软路由形式 DNS 服务器来解决。so~ 我就是这样双重覆盖😂

TIPS

mDNS使用的是 5353 端口
如果局域网下存在重复机器名debianhs,后续加入的设备域名会自动添加后缀 比如 debianhs-2.local,机器名不会自动更改

参考:

https://en.wikipedia.org/wiki/.local
https://en.wikipedia.org/wiki/Multicast_DNS
https://datatracker.ietf.org/doc/html/rfc6762
https://blog.beanbang.cn/2019/08/07/locate-hosts-using-mdns/

Windows 10如何ping计算机名之mDNS


https://wiki.noodlefighter.com/%E8%AE%A1%E7%AE%97%E6%9C%BA/Linux/linux%E7%9A%84local%E5%9F%9F%E5%90%8D/

docker入门使用命令

作者:matrix 发布时间:2022-06-30 分类:Linux

目前docker在开发和生产环境中经常使用。就算不是RD,你在github中总会看到他的身影。很多程序的demo版本都有提供docker镜像,用起来真的很爽。完全看作轻量级别虚拟机。

详细教程最好是自己网上多寻,这里整理下自己经常用到的命令。

下载镜像

# 搜索线上就像
docker search centos 

# 下载到本地
docker pull centos 

创建容器

容器是基于镜像创建的

可以根据镜像运行一次性的容器,运行完成后会停止运行,不会被销毁

# 运行容器 如果没有则创建
docker run centos

# 创建同时运行 uname -a命令
docker run centos  uname -a

# 设定容器名称
docker run  --name haha centos

#创建后台运行的容器
docker run --name test --detach/-d centos ping baidu.com

# 创建ssh可交互的容器
docker run --interactive/-i --tty/-t --name ssh centos

docker run -it --name ssh centos

# 创建一次性容器 执行目录挂载。退出之后自行销毁
docker run  -it --rm  -v ~/localData/讯康/HealthExam_Standard/wwwroot/manager/web:/data/web yha8897/nodejs-demo /bin/bash


# vue一键打包docker
#命令没有bash,命令完成后docker会自行退出,里面的分号;也可以换成&&
docker run  -it --rm  -v ~/localData/讯康/HealthExam_Standard/wwwroot/manager/web:/data yha8897/nodejs-demo sh -c 'cd /data;npm run build'

说明:
--interactive 可交互
--tty 输出到终端
--detach 后台驻留

查看正在运行的容器


docker ps # 查看所有容器 docker ps -a/--all

查看容器日志

 docker logs [容器name 或者 ID] 

 # 显示容器输出 类似tail -f
 docker logs --follow  [容器name 或者 ID]
 docker logs -f  [容器name 或者 ID]
 docker logs -t -f --tail=100 [容器name 或者 ID] 

容器ID可以缩写 比如只写前面几个字符。

查看容器启动的进程信息

# 查看容器db1ce9d2a3d0启动的进程信息 

$ docker container top db1ce9d2a3d0

停止/重启/删除容器

# 停止
docker stop haha

# 重启
docker restart haha

# 删除
docker rm [容器name 或者 ID] 

使用临时容器


docker run --rm -it --name mysql_demo -v ~/Desktop/master-bin.000040:/tmp/master-bin.000040 -p 3308:3308 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7 /bin/bash

清理容器

清理已经不使用(包含退出状态)的所有容器

$ docker system prune -f 

清理镜像

清理已经不使用的所有镜像

$ docker image prune -a 

VIM命令收集

作者:matrix 发布时间:2022-05-31 分类:Linux

意识到vim命令是多么的强大,遂单独整理一份。

打开文件

$ vi ./file1

打开后定位到指定文本位置

$ vi ./file1 +/keywords

+表示追加后续操作命令
/keywords 表示自上而下搜索关键字keywords

进入文本编辑模式

i

进入命令行模式

esc键退出编辑模式,输入:进入命令行模式

退出

输入:q 退出 加!表示强制操作

搜索

/ 进入搜索,输入关键字回车 n 查找下一个

删除

删除/剪切 当前行:dd

清空所有行::%d 或者 :1,$d

% 匹配所有行
1,$ 匹配1到末尾行
d表示删除

移动 类似删除操作

  1. 光标落在上一行使用 dd 删除当前行;
  2. 再使用 p 粘贴删除的行;

粘贴

p

复制

yy复制单行

复制多行:

  • 当前行

1yy复制当前行

2yy复制当前到下一行
...

  • 指定行

:5,6y复制5-6行内容

显示行号

输入:set nu

还原 撤销

u撤销修改
control + r 还原撤销动作

保存退出

:wq!强制保存且退出

:q!仅强制退出

:ZZ 保存且退出 (注意是大写的ZZ)

移动光标

$当前行尾
^当前行首

A移动到行尾且编辑

I移动到行首且编辑

gg首行

GG尾行

文件对比

vim支持文件对比 使用-d模式

$ vi -d ~/Desktop/ocr1.png ~/Desktop/imageCode.png

图片5489-VIM命令收集

参考:

https://blog.csdn.net/weixin_37657720/article/details/80645991

https://www.jianshu.com/p/c1ad434723ed

http://www.cnblogs.com/chenlogin/p/6245958.html

GIT撤销修改

作者:matrix 发布时间:2022-04-01 分类:Linux

撤销本地修改

本地代码仅是修改,还未做任何提交(add/commit操作)

$ git checkout file_name_path_1  file_name_path_2 file_name_path_3...  #撤销指定文件的修改
$ git checkout .   #撤销所有文件的修改

git checkout会直接还原修改的文件到仓库版本

撤销add

$ git reset HEAD file_name_path1  #指定还原文件的add操作

$ git reset HEAD #还原所有文件

撤销commit

已经commit提交,没有push到远端

#修改(替换)掉上次的commit
$ git commit --amend -m "Fix bug #42" 

#撤销commit操作(保留修改)
$ git reset HEAD^  #回到上一提交版本

#撤销commit操作(放弃修改)
$ git reset --hard HEAD^

#手动reset 版本id
$ git reset [--soft|--mixed|--hard]   COMMIT_ID  #COMMIT_ID为需要还原到的正确版本(正确要保留的版本)

--mixed 会保留源码,只是将git commit和index 信息回退到了某个版本.

--soft 保留源码,只回退到commit信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可.

--hard 源码也会回退到某个版本,commit和index 都会回退到某个版本.(注意,这种方式是改变本地代码仓库源码)

撤销push

还原已提交push的修改,本质是新增commit提交

方法1 还原指定版本的修改:

$ git revert COMMIT_ID #COMMIT_ID为需要撤销的版本(丢弃不要的版本)
$ git push #再执行推送

方法2 硬删除之后的所有提交:

$ git reset --hard COMMID_ID #最近提交需要的版本(删除之后的所有提交)
$ git push -f

http://www.ruanyifeng.com/blog/2019/12/git-undo.html

http://blog.csdn.net/zhangkongzhongyun/article/details/8025288

https://www.cnblogs.com/wuyun-blog/p/10026363.html

https://www.jianshu.com/p/37f3a7e4a193

vscode remote-ssh 内网穿透远程开发调试

作者:matrix 发布时间:2021-10-07 分类:command Linux

线上代码有时候会需要部署到内网或者防火墙后面的本地服务器环境,这个时候发布代码或者调试都会造成不便。

使用环境

测试环境为 mac vscode

windows版本的操作相差不大。

vscode作为ide编辑器,也作为文件管理工具来上传下载服务器文件。需要安装Remote - SSH插件完成这些功能。

目的

本地环境可以直接编辑操作远程服务器中的文件,当然这非常危险和忌讳!

修改文件前你需要做备份然后灾难还原 😀

路径也很清晰,通过中转来访问:

localhost -> jump -> target-service

本地电脑连接中转服务器,再通过中转服务器连接后端的target-service完成操作。

配置ssh

插件安装之后按F1键打开命令行,找到remote-ssh相关文件配置命令。
图片5271-vscode remote-ssh 内网穿透远程开发调试

或者可以直接修改~/.ssh/config文件

配置

# 中转服务器
Host jump-box
    HostName 118.X.X.11
    User root
    # IdentityFile ~/.ssh/jumpbox

# 需要连接的目标服务器 即后端的非暴露地址
# Target machine with private IP address
Host target-box
    HostName 192.168.1.11
    User root
    # IdentityFile ~/.ssh/target
    ProxyCommand ssh -q -W %h:%p jump-box

说明:
如果服务器有设置密钥登录,IdentityFile参数用于设置私钥文件地址。

连接

配置完成之后,点击左侧的remote - ssh插件的选项页面,就能看到配置的服务器。包含jump-box,target-box

图片5272-vscode remote-ssh 内网穿透远程开发调试

之后打开连接,点击右侧的文件夹📁图标打开新窗口,vscode会进行连接请求。若是密码登录请求则会让你输入密码,依次连接jump-box,target-box服务器,且最终停留在target-box服务器上,可以在线编辑操作非常方便。

vscode连接成功后,左下角会有绿色连接提示。

文件操作

和其他编辑器的基本功能都是一样,代码文件直接编辑保存,之后会自动上传到服务器。

如果想上传文件需要在vscode中找到要上传的文件或目录,点击右键复制。之后服务器的vscode窗口中点击右键粘贴。

图片5275-vscode remote-ssh 内网穿透远程开发调试

参考:

https://code.visualstudio.com/blogs/2019/10/03/remote-ssh-tips-and-tricks

http://kb.ictbanking.net/article.php?id=639

https://code.visualstudio.com/docs/remote/ssh

https://kenzoluo.github.io/2020/03/13/VScode%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E7%9A%84%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B/

https://xirikm.net/2019/619-1