飞腾CPU+ARM+容器部署Java服务的坑
2021/7/28 11:05:53
本文主要是介绍飞腾CPU+ARM+容器部署Java服务的坑,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
背景
最近项目部署任务,最终客户的环境是:飞腾CPU(ARM64)+ 银河麒麟(Kylin)+ 容器部署
现象
部署完成后发现:服务运行5-10分钟就会崩溃,报错日志很多,最有用的信息是下面这一行:guarantee(Rs != Rn && Rs != Rt) failed: unpredictable instruction
解决
根据报错内容猜测是Java服务使用的基础镜像的问题。当前用的openjdk:8-jdk-alpine
作为基础镜像,换成openjdk:8
作为基础镜像,重新部署后该问题解决,但是新的问题又出现了
我们知道SpringBoot读取配置是有一定的顺序的,详见:Spring Boot Features.external-config。所以我们将特殊配置都放进了容器的环境变量,结果问题来了:SpringBoot启动后不会读取环境变量!
然后我们在main方法中增加了代码:
public static void main(String[] args) {
LOGGER.warn("=============test=============");
for (Map.Entry<String, String> entry : System.getenv().entrySet()) {
LOGGER.warn("{}={}", entry.getKey(), entry.getValue());
}
LOGGER.warn("=============test=============");
SpringApplication.run(Application.class, args);
}
打印出来的结果也确实没有我们额外定义的环境变量。
后来偶然发现:如果执行/docker-entrypoint.sh
问题就存在,但是执行bash /docker-entrypoint.sh
就没问题。然后恍然大悟看了眼/docker-entrypoint.sh
的解释器:果然是#!/bin/sh
。这么写也是因为openjdk:8-jdk-alpine
的基础镜像里就没有bash
这么个东西!
总以为是代码问题,在代码层面纠结了好久。结果还是因为自己Linux知识比较渣...
这篇关于飞腾CPU+ARM+容器部署Java服务的坑的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南
- 2024-09-30Dnd-Kit学习:新手快速入门指南