zoukankan      html  css  js  c++  java
  • 飞腾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知识比较渣...

    笔者只是初学者,开此博客的初衷是为了给自己的学习过程留一个痕迹。所以您可能发现笔者措辞不严谨、逻辑不合理,甚至代码有错误、结论很偏颇等等。笔者感激各位的讨论和指正,并在此不胜感激!拜谢!欢迎加QQ群讨论:852410026
  • 相关阅读:
    arrow
    简单库函数
    计算机视觉从入门到放肆
    合并排序算法
    React应用数据传递的方式
    发布一个npm package
    绝对路径/相对路径/根路径
    常见的数据处理方法
    从设计稿到实现React应用(分类数据处理)
    提高React组件的复用性
  • 原文地址:https://www.cnblogs.com/LOVE0612/p/15069409.html
Copyright © 2011-2022 走看看