记录guarantee(Rs != Rn && Rs != Rt) failed: unpredictable instruction问题解决过程

记录解决aarch64架构飞腾cpu服务器上基于openjdk:8-jdk-alpine的docker容器出现guarantee(Rs != Rn && Rs != Rt) failed: unpredictable instruction的问题


前言

最近在将docker服务从 aarch64架构鲲鹏的服务器 迁移到 aarch64架构飞腾cpu的服务器 时,将基于openjdk:8-jdk-alpine的java服务启动后过一段时间日志就会出现 guarantee(Rs != Rn && Rs != Rt) failed: unpredictable instruction(见下图),服务无法正常运行,一时间不知怎么解决,本文记录了解决这一问题的过程。

在这里插入图片描述


一、百度搜索相关报错

通过百度搜索关键词 guarantee(Rs != Rn && Rs != Rt) failed: unpredictable instruction,找到了相关的文章:https://blog.51cto.com/u_15075507/3337574,按照文中所说将openjdk:8-jdk-alpine 换成 openjdk:8,本人尝试了一下确实能解决该问题,但原来镜像里面还通过apk add --no-cache xxx 安装了一些软件包,而apk命令 是Alpine Linux 下的包管理工具,openjdk:8运行会报错,因此换成openjdk:8可能会因缺少相关软件包导致服务存在问题,最终没有采用这种方式。

二、github上搜索相关报错

通过github上搜索关键词 guarantee(Rs != Rn && Rs != Rt) failed: unpredictable instruction,再点击Issues(如下图)会看到很多类似的问题,查看了几个issue,最终找到了相似的情况。

在这里插入图片描述

找了一篇标题为Restarting loop(循环重启)的Issue:https://github.com/hassio-addons/addon-traccar/issues/21
文中有个回答说是openjdk的bug,详见:https://bugs.openjdk.org/browse/JDK-8153172,下图可见 Fix Versionopenjdk8u292,由此猜测可能是基础镜像jdk版本低于了8u292

在这里插入图片描述在这里插入图片描述

通过docker inspect 命令查看了openjdk:8-jdk-alpine镜像的信息发现jdk版本是8u212,于是产生了一个大胆的想法,修改官方openjdk的Dockerfile文件中的jdk版本,重新制作jdk镜像

在这里插入图片描述

通过在dockerhub中搜索openjdk,在详情页中能够找到官方github地址:https://github.com/docker-library/openjdk,克隆下来后没有找到jdk8版本dockerfile,于是通过查找历史提交记录最终找到了openjdk:8-jdk-alpineDockerfile文件,版本果然是8u212(如下图)

在这里插入图片描述

下面是修改后的Dockerfile文件,最主要修改了alpine镜像版本由3.9 -> 3.`5,jdk版本由8u212 -> 8u345(jdk版本需要和alpine版本对应,详见 https://mirrors.aliyun.com/alpine),另外还配置了阿里云镜像加速构建镜像

#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "update.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#

FROM alpine:3.15

# A few reasons for installing distribution-provided OpenJDK:
#
#  1. Oracle.  Licensing prevents us from redistributing the official JDK.
#
#  2. Compiling OpenJDK also requires the JDK to be installed, and it gets
#     really hairy.
#
#     For some sample build times, see Debian's buildd logs:
#       https://buildd.debian.org/status/logs.php?pkg=openjdk-8

# Default to UTF-8 file.encoding
ENV LANG C.UTF-8

# add a simple script that can auto-detect the appropriate JAVA_HOME value
# based on whether the JDK or only the JRE is installed
RUN { \
		echo '#!/bin/sh'; \
		echo 'set -e'; \
		echo; \
		echo 'dirname "$(dirname "$(readlink -f "$(which javac || which java)")")"'; \
	} > /usr/local/bin/docker-java-home \
	&& chmod +x /usr/local/bin/docker-java-home
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV PATH $PATH:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin

ENV JAVA_VERSION 8u345
ENV JAVA_ALPINE_VERSION 8.345.01-r3

# 配置阿里云镜像
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN set -x \
	&& apk add --no-cache \
		openjdk8="$JAVA_ALPINE_VERSION" \
	&& [ "$JAVA_HOME" = "$(docker-java-home)" ]

# If you're reading this and have any feedback on how this image could be
# improved, please open an issue or a pull request so we can discuss it!
#
#   https://github.com/docker-library/openjdk/issues

构建完成后试了一下,目前能够正常运行,解决了guarantee(Rs != Rn && Rs != Rt) failed: unpredictable instruction问题

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值