解决 “Function not implemented“, 为 arm64 架构宿主机重新构建 Nacos 镜像

前言

官方的 Nacos 镜像在 arm64 架构的系统上运行容器会出现 “Function not implemented” 的相关异常日志以致于容器内 Nacos 无法正常启动.
原因是官方镜像基于的 CentOS 7.x 的基础镜像版本并不支持 arm64 架构的系统.

其实 7.x 版本是有 arm64 支持的, 只是官方镜像并没有采用那个 platform (docker pull --platform=<plartform> <image-name>:<tag>)

于是下载官方 Dockerfile 尝试将基础镜像版本改为 CentOS 8.x, 但是, 由于 CentOS 已经 EOL 了, 镜像构建过程中出现各种 “Failed to download metadata for repo ‘xxx’: Cannot prepare internal mirrorlist: No URLs in mirrorlist” 的问题.
进而, 将基础镜像改为 “rockylinux:8”, 关于 rockylinux 的介绍, 可以参考: https://rockylinux.org

重新构建镜像的步骤

首先, 去到 Nacos 官方 Github 地址找到你想要的版本 (这里以 v2.1.0 为例, nacos/nacos-server:v2.1.0 的 Dockerfile (https://github.com/nacos-group/nacos-docker/tree/v2.1.0/build)), 简单阅读一下 Dockerfile, 注意几个关键点:

FROM centos:7.9.2009
...



ADD bin/docker-startup.sh bin/docker-startup.sh
ADD conf/application.properties conf/application.properties

...

首先将 “From centos:7.9.2009” 修改为 “FROM rockylinux:8”, 然后将 bin 目录和 conf 目录都下载到本地和 Dockerfile 同一目录. 结构如下:

$ tree ./
./
├── Dockerfile
├── bin
│   └── docker-startup.sh
└── conf
    └── application.properties

重新构建镜像:

docker build -t caplike/nacos-server:v2.1.0 .

先尝试启动一次容器:

docker run --name nacos -d caplike/nacos-server:v2.1.0

停止容器, cp 相关目录 (为了 bind mounts):

docker cp nacos:/home/nacos/conf .docker-mounts/nacos-server2.1.0
docker cp nacos:/home/nacos/logs .docker-mounts/nacos-server2.1.0
docker cp nacos:/home/nacos/data .docker-mounts/nacos-server2.1.0
docker cp nacos:/home/nacos/bin  .docker-mounts/nacos-server2.1.0

然后再启动:
值得一提的是, 由于 Nacos 2.x 额外暴露了两个 RPC 端口用于通信, 分别是按照偏移量 1000 和 1001 计算的, 所以端口映射改了的话, 相应的剩下两个 RPC 的端口也要加上对应的偏移量, 如:

docker run -d -p 20003:8848 -p 21003:9848 -p 21004:9849 \
 --name nacos-server2.1.0 \
 -v .docker-mounts/nacos-server2.1.0/conf:/home/nacos/conf \
 -v .docker-mounts/nacos-server2.1.0/data:/home/nacos/data \
 -v .docker-mounts/nacos-server2.1.0/logs:/home/nacos/logs \
 -e MODE=standalone \
 --restart=always \
 caplike/nacos-server:v2.1.0

最后, 附上我自己构建的支持 arm64 架构的 nacos-server:v2.1.0 镜像, 欢迎直接使用, HUB 地址: https://hub.docker.com/repository/docker/caplike/nacos-server/general

附录

FAQ: “cannot install the best candidate for the job” & “conflicting requests”

yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget iputils nc vim libcurl 后追加 "–nobest --allowerasing”

Dockerfile 文件

FROM rockylinux:8
MAINTAINER like "scorpio.caplike@gmail.com"

# set environment
ENV MODE="cluster" \
    PREFER_HOST_MODE="ip"\
    BASE_DIR="/home/nacos" \
    CLASSPATH=".:/home/nacos/conf:$CLASSPATH" \
    CLUSTER_CONF="/home/nacos/conf/cluster.conf" \
    FUNCTION_MODE="all" \
    JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk" \
    NACOS_USER="nacos" \
    JAVA="/usr/lib/jvm/java-1.8.0-openjdk/bin/java" \
    JVM_XMS="1g" \
    JVM_XMX="1g" \
    JVM_XMN="512m" \
    JVM_MS="128m" \
    JVM_MMS="320m" \
    NACOS_DEBUG="n" \
    TOMCAT_ACCESSLOG_ENABLED="false" \
    TIME_ZONE="Asia/Shanghai"

ARG NACOS_VERSION=2.1.0
ARG HOT_FIX_FLAG=""

WORKDIR $BASE_DIR

RUN set -x \
    && yum update -y \
    && yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget iputils nc  vim libcurl --nobest --allowerasing
RUN wget  https://github.com/alibaba/nacos/releases/download/${NACOS_VERSION}${HOT_FIX_FLAG}/nacos-server-${NACOS_VERSION}.tar.gz -P /home
RUN tar -xzvf /home/nacos-server-${NACOS_VERSION}.tar.gz -C /home \
    && rm -rf /home/nacos-server-${NACOS_VERSION}.tar.gz /home/nacos/bin/* /home/nacos/conf/*.properties /home/nacos/conf/*.example /home/nacos/conf/nacos-mysql.sql
RUN yum autoremove -y wget \
    && ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone \
    && yum clean all




ADD bin/docker-startup.sh bin/docker-startup.sh
ADD conf/application.properties conf/application.properties


# set startup log dir
RUN mkdir -p logs \
	&& cd logs \
	&& touch start.out \
	&& ln -sf /dev/stdout start.out \
	&& ln -sf /dev/stderr start.out
RUN chmod +x bin/docker-startup.sh

EXPOSE 8848
ENTRYPOINT ["bin/docker-startup.sh"]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值