首页
关于
壁纸
直播
留言
友链
统计
Search
1
《三国志英杰传》攻略
6,338 阅读
2
Emby客户端IOS破解
6,209 阅读
3
白嫖Emby
6,202 阅读
4
《吞食天地1》金手指代码
6,093 阅读
5
破解emby-server
4,374 阅读
moonjerx
game
age-of-empires
zx3
san-guo-zhi
尼尔:机械纪元
net
emby
learn-video
docker
torrent
photoshop
route
minio
git
ffmpeg
im
vue
gitlab
typecho
svn
alipay
nasm
srs
mail-server
tailscale
kkfileview
aria2
webdav
synology
redis
oray
chemical
mxsite
math
π
x-ui
digital-currency
server
nginx
baota
k8s
http
cloud
linux
shell
database
vpn
esxi
rancher
domain
k3s
ewomail
os
android
windows
ios
app-store
macos
develop
java
javascript
uniapp
nodejs
hbuildx
maven
android-studio
jetbrain
jenkins
css
mybatis
php
python
hardware
hard-disk
pc
RAM
software
pt
calibre
notion
office
language
literature
philosophy
travel
登录
Search
标签搜索
ubuntu
mysql
openwrt
zerotier
springboot
centos
openvpn
jdk
吞食天地2
synology
spring
idea
windows11
吞食天地1
transmission
google-play
Japanese
xcode
群晖
kiftd
MoonjerX
累计撰写
380
篇文章
累计收到
465
条评论
首页
栏目
moonjerx
game
age-of-empires
zx3
san-guo-zhi
尼尔:机械纪元
net
emby
learn-video
docker
torrent
photoshop
route
minio
git
ffmpeg
im
vue
gitlab
typecho
svn
alipay
nasm
srs
mail-server
tailscale
kkfileview
aria2
webdav
synology
redis
oray
chemical
mxsite
math
π
x-ui
digital-currency
server
nginx
baota
k8s
http
cloud
linux
shell
database
vpn
esxi
rancher
domain
k3s
ewomail
os
android
windows
ios
app-store
macos
develop
java
javascript
uniapp
nodejs
hbuildx
maven
android-studio
jetbrain
jenkins
css
mybatis
php
python
hardware
hard-disk
pc
RAM
software
pt
calibre
notion
office
language
literature
philosophy
travel
页面
关于
壁纸
直播
留言
友链
统计
搜索到
126
篇与
server
的结果
2025-08-27
解决Docker容器中MySQL连接因LANG环境变量缺失导致的问题
解决Docker容器中MySQL连接因LANG环境变量缺失导致的问题问题描述在使用Docker容器部署Spring Boot应用时,遇到以下错误:java.lang.IllegalStateException: DBAppender cannot function if the JDBC driver does not support getGeneratedKeys method *and* without a specific SQL dialect环境信息:Docker容器:基于Ubuntu 22.04,运行宝塔面板数据库:MySQL 8.0.26(独立容器)应用:Spring Boot + Logback + MySQL Connector 8.0.16关键发现:同样的JAR包在虚拟机上运行正常,在容器中无法启动快速解决方案根本解决方案(推荐):apt-get update && apt-get install -y locales && locale-gen en_US.UTF-8 && update-locale LANG=en_US.UTF-8 && export LANG=en_US.UTF-8 && export LC_ALL=en_US.UTF-8 && echo 'export LANG=en_US.UTF-8' >> ~/.bashrc && echo 'export LC_ALL=en_US.UTF-8' >> ~/.bashrc && source ~/.bashrc临时解决方案(连接参数):在数据库连接URL中添加:allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8spring: datasource: url: jdbc:mysql://127.0.0.1:3306/your_database?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8或者在启动容器时添加环境变量:docker run -d \ --name your-container \ --net=host \ --restart always \ --privileged \ -e LANG=C.UTF-8 \ -e LC_ALL=C.UTF-8 \ your-image:tag详细排查过程初期错误理解最初看到错误信息,以为是Logback配置问题,尝试了多种方案:取消注释SQL方言配置 ❌<sqlDialect class="ch.qos.logback.core.db.dialect.MySQLDialect"/>使用DriverManagerConnectionSource ❌升级/降级Logback版本 ❌使用HikariCP替代Commons DBCP ❌暂时禁用DBAppender ✅(临时方案,不是根本解决)转换思路:环境差异分析经过两天的配置调试无果后,开始从环境角度分析问题。1. Java版本对比# 容器和虚拟机都是相同版本 java version "1.8.0_381" Java(TM) SE Runtime Environment (build 1.8.0_381-b09)2. 环境变量对比容器环境:JAVA_HOME=/home/root/soft/jdk1.8.0_381 PATH=/home/root/soft/jdk1.8.0_381/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin # 缺失 LANG 和 LC_* 变量虚拟机环境:JAVA_HOME=/home/root/soft/jdk1.8.0_381 LANG=en_US.UTF-8 # 关键差异! PATH=/home/root/soft/jdk1.8.0_381/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin3. MySQL驱动行为测试创建测试程序验证MySQL驱动的getGeneratedKeys支持:import java.sql.*; public class TestMySQLDriver { public static void main(String[] args) { try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:3306/your_database?useSSL=false", "username", "password"); DatabaseMetaData meta = conn.getMetaData(); System.out.println("supportsGetGeneratedKeys: " + meta.supportsGetGeneratedKeys()); System.out.println("Driver version: " + meta.getDriverVersion()); System.out.println("Database version: " + meta.getDatabaseProductVersion()); conn.close(); } catch (Exception e) { e.printStackTrace(); } } }测试结果对比:容器中:java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835) ... at TestMySQLDriver.main(TestMySQLDriver.java:7)虚拟机中:supportsGetGeneratedKeys: true Driver version: mysql-connector-java-8.0.16 Database version: 8.0.26关键发现: 容器环境尝试设置LANG环境变量时出现警告:export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)根因分析核心问题: 容器环境缺少LANG和LC_ALL环境变量,导致:Public Key Retrieval错误 - 这是MySQL 8.0的安全特性,在字符编码异常时更容易触发字符编码处理异常 - MySQL连接器在处理字符编码时出现问题SSL/TLS握手失败 - 编码问题影响了安全连接的建立getGeneratedKeys方法识别失败 - 驱动无法正确识别数据库功能支持本质问题: Public Key Retrieval is not allowed 错误在MySQL 8.0中很常见,但通常在环境正常的情况下可以通过连接参数解决。然而在缺少locale的容器环境中,这个错误变得更加顽固。解决方案详解方案1:修复LANG环境变量(根本解决方案,推荐)# 1. 安装locale支持 apt-get update apt-get install -y locales # 2. 生成UTF-8 locale locale-gen en_US.UTF-8 update-locale LANG=en_US.UTF-8 # 3. 设置环境变量 export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 # 4. 永久化配置 echo 'export LANG=en_US.UTF-8' >> ~/.bashrc echo 'export LC_ALL=en_US.UTF-8' >> ~/.bashrc source ~/.bashrc # 5. 验证配置 locale方案2:连接字符串参数解决(临时方案)如果无法修改容器环境,可以通过调整MySQL连接参数来绕过这个问题:// 添加 allowPublicKeyRetrieval=true 参数 String url = "jdbc:mysql://127.0.0.1:3306/your_database?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8";完整连接参数建议:String url = "jdbc:mysql://127.0.0.1:3306/your_database?" + "useSSL=false&" + "allowPublicKeyRetrieval=true&" + "useUnicode=true&" + "characterEncoding=UTF-8&" + "serverTimezone=Asia/Shanghai";Spring Boot配置文件:spring: datasource: url: jdbc:mysql://127.0.0.1:3306/your_database?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai username: username password: password driver-class-name: com.mysql.cj.jdbc.Driver注意: 方案2虽然能解决连接问题,但不能根本解决locale缺失问题,可能在其他功能上仍有隐患。推荐优先使用方案1。方案3:Docker启动时配置docker run -d \ --name baota \ --net=host \ --restart always \ --privileged \ -e LANG=C.UTF-8 \ -e LC_ALL=C.UTF-8 \ -v /path/to/data:/data \ your-image:tag方案4:Dockerfile中预设FROM ubuntu:22.04 # 安装locale并设置环境变量 RUN apt-get update && \ apt-get install -y locales && \ locale-gen en_US.UTF-8 && \ update-locale LANG=en_US.UTF-8 ENV LANG=C.UTF-8 ENV LC_ALL=C.UTF-8 # 其他配置...验证解决效果修复后重新测试MySQL连接:java -cp .:mysql-connector-java-8.0.16.jar TestMySQLDriver期望输出:supportsGetGeneratedKeys: true Driver version: mysql-connector-java-8.0.16 Database version: 8.0.26经验总结环境一致性的重要性 - 看似相同的环境可能存在关键差异字符编码的影响范围 - LANG环境变量不仅影响显示,还会影响网络通信和数据库连接问题定位思路 - 当配置层面无法解决时,要从环境层面分析Docker容器的注意事项 - 容器环境通常是精简的,可能缺少一些基础的系统配置相关问题和预防类似问题可能出现在:其他需要字符编码的Java应用Python应用的数据库连接文件上传/下载功能国际化(i18n)应用预防措施:构建Docker镜像时主动设置LANG环境变量在CI/CD流程中添加环境一致性检查制作标准化的基础镜像,包含必要的locale配置关键要点:根本问题是locale缺失:Public Key Retrieval is not allowed 在MySQL 8.0中很常见,但在locale正常的环境中通常可以通过连接参数解决。在Docker容器的精简环境中,locale缺失使这个问题变得更加复杂。两种解决思路:治本:修复容器的locale环境,这样应用的各个方面都能正常工作治标:通过连接参数绕过验证,但可能在其他功能上仍有隐患环境一致性:Docker容器环境的精简性可能导致一些看似无关的系统配置缺失,而这些配置对应用的正常运行至关重要。在排查此类问题时,环境差异分析往往比配置调优更有效。
2025年08月27日
14 阅读
0 评论
0 点赞
2024-12-18
linux对用户组操作
1. 查看当前用户组查看所有用户组要查看系统中所有的用户组,可以使用cat或less命令查看/etc/group文件,该文件包含了所有用户组的信息。cat /etc/group或者使用less进行分页查看:less /etc/group每个条目包含四个字段,分别是:组名组密码(通常为空或x,表示密码存储在/etc/gshadow中)GID(Group ID)成员列表(用逗号分隔)查看当前用户的用户组要查看当前登录用户所属的所有用户组,可以使用groups命令:groups或者使用id命令,它会显示更详细的信息,包括用户ID(UID)和GID:id2. 添加用户组要创建一个新的用户组,可以使用groupadd命令:sudo groupadd 新组名例如,创建一个名为developers的用户组:sudo groupadd developers3. 删除用户组要删除一个用户组,可以使用groupdel命令:sudo groupdel 组名例如,删除developers用户组:sudo groupdel developers注意:删除用户组时,请确保该组没有活动成员,否则可能会导致权限问题。4. 修改用户组修改用户组名称要更改用户组的名称,可以使用groupmod命令:sudo groupmod -n 新组名 旧组名例如,将developers用户组重命名为devteam:sudo groupmod -n devteam developers修改用户组的GID你还可以更改用户组的GID(Group ID):sudo groupmod -g 新GID 组名例如,将devteam用户组的GID改为1005:sudo groupmod -g 1005 devteam5. 查询用户组信息查询特定用户组的信息要查看特定用户组的详细信息,可以使用getent命令:getent group 组名例如,查看devteam用户组的详细信息:getent group devteam这将返回类似于以下的输出:devteam:x:1005:user1,user2查询用户属于哪些组要查看某个特定用户属于哪些用户组,可以使用groups命令加上用户名:groups 用户名例如,查看bigserver用户属于哪些组:groups bigserver或者使用id命令:id bigserver6. 增加用户到用户组要将用户添加到一个用户组,可以使用usermod命令:sudo usermod -aG 组名 用户名例如,将bigserver用户添加到www用户组:sudo usermod -aG www bigserver-aG选项表示将用户添加到指定的组,而不影响其现有的其他组成员身份。7. 删除用户从用户组要将用户从一个用户组中移除,可以编辑/etc/group文件,或者使用gpasswd命令:sudo gpasswd -d 用户名 组名
2024年12月18日
32 阅读
0 评论
0 点赞
2024-11-23
【openwrt】通过zerotier网络连接路由器时,如何配置使用TYDD终端工具
一、创建新的接口命名为ZEROTIER,接口的协议选择DHCP客户端,接口选择已经连接的ZEROTIER适配器。修改刚刚创建的接口配置,防火墙设置,新建ZEROTIER防火墙,保存并应用二、配置防护墙端口转发配置7681端口转发,并选择ZEROTIER网络三、自定义规则iptables -I FORWARD -i ztyfejv2us -j ACCEPT iptables -I FORWARD -o ztyfejv2us -j ACCEPT iptables -t nat -I POSTROUTING -o ztyfejv2us -j MASQUERADE
2024年11月23日
184 阅读
0 评论
1 点赞
2024-09-10
Ubuntu环境中配置JDK环境变量
在Ubuntu系统中配置JDK环境变量是一项常见的任务。本文将指导你如何通过一行命令来设置环境变量,并确保其在系统范围内生效。此外,本文还将解决在配置过程中可能遇到的一些常见问题。前言在开发环境中,正确配置JDK环境变量是非常重要的。本文将展示如何在Ubuntu系统中持久化地设置环境变量,并确保其立即生效。步骤一:确定JDK安装路径首先,确保你知道JDK的安装路径。例如,假设JDK安装在以下路径:/home/$USER/programs/soft/jdk1.8.0_381这里的$USER变量会自动扩展为当前用户的用户名。步骤二:设置环境变量接下来,我们将使用一行命令来设置环境变量,并将其追加到系统的/etc/profile文件中。这将使得环境变量对所有用户都生效。一行命令设置环境变量使用以下命令来设置环境变量,并确保内容在文件中以合适的格式显示:echo -e 'export JAVA_HOME="/home/$USER/programs/soft/jdk1.8.0_381"\nexport PATH="$JAVA_HOME/bin:$PATH"' | sudo tee -a /etc/profile && source /etc/profile命令解析创建环境变量设置:echo -e 'export JAVA_HOME="/home/$USER/programs/soft/jdk1.8.0_381"\nexport PATH="$JAVA_HOME/bin:$PATH"'这条命令创建了一个包含环境变量设置的字符串,并使用\n插入换行符,以确保内容在文件中以合适的格式显示。追加到/etc/profile:| sudo tee -a /etc/profile使用tee命令将上述字符串追加到/etc/profile文件末尾,并使用sudo以管理员权限执行。使更改立即生效:&& source /etc/profile执行source /etc/profile命令使更改立即生效。解决可能的问题在配置过程中,你可能会遇到一些问题。下面列出了一些常见问题及其解决方案。问题1:vim命令不可用如果你尝试使用vim编辑器来编辑/etc/profile文件时遇到以下错误:vim profile Command 'vim' is available in the following places * /bin/vim * /usr/bin/vim The command could not be located because '/bin:/usr/bin' is not included in the PATH environment variable. vim: command not found你可以通过临时添加/bin和/usr/bin到PATH变量来解决这个问题。执行以下命令:export PATH="/bin:/usr/bin:$PATH"然后,你可以使用vim或其他编辑器来编辑/etc/profile:vim /etc/profile或者使用nano编辑器:nano /etc/profile在编辑器中,添加以下行到文件末尾:export JAVA_HOME="/home/$USER/programs/soft/jdk1.8.0_381" export PATH="$JAVA_HOME/bin:$PATH"保存并退出编辑器后,再次使更改立即生效:source /etc/profile验证设置设置完成后,你可以通过以下命令验证环境变量是否已正确设置:echo $JAVA_HOME echo $PATH确保输出的路径符合预期。结语通过以上步骤,你可以轻松地在Ubuntu系统中设置JDK环境变量,并确保其对所有用户都生效。希望这篇文章对你有所帮助!
2024年09月10日
78 阅读
0 评论
0 点赞
2024-09-10
如何在Docker容器中管理服务端口及SSH服务
在使用Docker容器时,了解容器内运行的服务及其占用的端口是非常重要的。本文将指导您如何列出容器内所有服务名称和占用的端口,并检查容器是否运行着OpenSSH服务。1. 列出容器内所有服务名称和占用的端口要找出当前容器内运行的服务及其绑定的端口,可以使用netstat或ss命令。使用netstat命令如果您容器中有安装netstat,可以使用以下命令来查找所有监听的TCP和UDP端口:netstat -tuln命令输出可能类似于:Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:63322 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:888 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN tcp6 0 0 :::63322 :::* LISTEN 使用ss命令如果您的容器使用的是ss命令,可以这样操作:ss -tuln输出看起来与netstat类似。2. 检查容器是否运行着OpenSSH服务要检查容器内是否正在运行OpenSSH服务,可以使用pgrep或者ps命令加上grep来查找。使用pgrep命令如果您有pgrep命令,可以直接这样查询:pgrep sshd如果有ssh服务正在运行,它将返回一个或多个进程ID。如果没有返回任何东西,则意味着没有ssh服务正在运行。使用ps命令结合grep如果没有pgrep,可以使用ps命令结合grep来查找:ps aux | grep sshd这将显示所有包含sshd关键词的进程列表。如果没有任何输出(除了grep自身的进程),则表示没有运行OpenSSH服务。3. 查看具体服务占用端口的情况假设您已经知道某个端口被某个服务占用,但不确定是哪个具体服务,可以使用lsof命令来查找打开文件和IPC节点(例如网络套接字)。lsof -i :端口号例如,要找到占用端口63322的服务,可以这样做:lsof -i :63322这将会显示类似于以下的输出:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 20 root 3u IPv4 29903991 0t0 TCP *:63322 (LISTEN) sshd 20 root 4u IPv6 29903993 0t0 TCP *:63322 (LISTEN) BT-Panel 849 root 16u IPv4 41302087 0t0 TCP localhost:53958->localhost:63322 (ESTABLISHED) sshd 47399 root 3u IPv4 41299442 0t0 TCP localhost:63322->localhost:53958 (ESTABLISHED)这里可以看到sshd进程使用PID 20占用着端口63322,并且有两个监听端口的文件描述符,一个是IPv4,另一个是IPv6。4. 永久禁用IPv6连接如果您希望永久禁用IPv6连接,可以通过修改OpenSSH的配置文件来实现这一点。打开sshd_config文件编辑器:sudo nano /etc/ssh/sshd_config在文件中添加或修改以下行:# ListenAddress :: (这行可以注释掉) ListenAddress 0.0.0.0保存并关闭文件。重启OpenSSH服务使更改生效:sudo systemctl restart ssh结论通过上述步骤,您可以轻松地管理和监控Docker容器内的服务端口及SSH服务的状态。这对于保证系统的安全性和稳定性至关重要。希望本文能够帮助您更好地理解和控制您的容器环境。
2024年09月10日
65 阅读
0 评论
0 点赞
1
2
...
26
您的IP: