Nacos适配达梦数据库并制作镜像

news2024/12/28 2:54:23

背景:因项目需要信创,需将原本的mysql数据库,改成达梦数据库

一、部署达梦数据库

1.1 部署达梦数据库服务

可参考:Docker安装达梦数据库_达梦数据库docker镜像-CSDN博客

1.2 创建nacos数据库

create user SAFE_NACOS identified by "Safehub@2024";

grant "PUBLIC","SOI","VTI" to "SAFE_NACOS";

grant create table to "SAFE_NACOS";

CREATE SCHEMA "SAFE_NACOS" AUTHORIZATION "SAFE_NACOS";

1.3 适配了达梦的nacos脚本

CREATE TABLE "SAFE_NACOS"."CONFIG_INFO"(
"ID" BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ID',
"DATA_ID" VARCHAR(255) NOT NULL COMMENT 'DATA_ID',
"GROUP_ID" VARCHAR(128) DEFAULT NULL COMMENT 'GROUP_ID',
"CONTENT" CLOB NOT NULL  COMMENT 'CONTENT',
"MD5" VARCHAR(32) DEFAULT NULL COMMENT 'MD5',
"GMT_CREATE" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
"GMT_MODIFIED" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
"SRC_USER" TEXT COMMENT 'SOURCE USER',
"SRC_IP" VARCHAR(50) DEFAULT NULL COMMENT 'SOURCE IP',
"APP_NAME" VARCHAR(128) DEFAULT NULL COMMENT 'APP_NAME',
"TENANT_ID" VARCHAR(128) DEFAULT '' COMMENT '租户字段',
"C_DESC" VARCHAR(256) DEFAULT NULL COMMENT 'CONFIGURATION DESCRIPTION',
"C_USE" VARCHAR(64) DEFAULT NULL COMMENT 'CONFIGURATION USAGE',
"EFFECT" VARCHAR(64) DEFAULT NULL COMMENT '配置生效的描述',
"TYPE" VARCHAR(64) DEFAULT NULL COMMENT '配置的类型',
"C_SCHEMA" TEXT COMMENT '配置的模式',
"ENCRYPTED_DATA_KEY" VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '密钥',
NOT CLUSTER PRIMARY KEY("ID")
);
COMMENT ON TABLE "SAFE_NACOS"."CONFIG_INFO" IS '配置表' ;
CREATE UNIQUE INDEX "UK_CONFIGINFO_DATAGROUPTENANT" ON "SAFE_NACOS"."CONFIG_INFO"("DATA_ID","GROUP_ID","TENANT_ID");

/******************************************/
/* 表名称 = CONFIG_INFO_AGGR */
/******************************************/
CREATE TABLE "SAFE_NACOS"."CONFIG_INFO_AGGR" (
"ID" BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ID',
"DATA_ID" VARCHAR(255) NOT NULL COMMENT 'DATA_ID',
"GROUP_ID" VARCHAR(128) NOT NULL COMMENT 'GROUP_ID',
"DATUM_ID" VARCHAR(255) NOT NULL COMMENT 'DATUM_ID',
"CONTENT" Clob NOT NULL COMMENT '内容',
"GMT_MODIFIED" DATETIME NOT NULL COMMENT '修改时间',
"APP_NAME" VARCHAR(128) DEFAULT NULL COMMENT 'APP_NAME',
"TENANT_ID" VARCHAR(128) DEFAULT '' COMMENT '租户字段',
NOT CLUSTER PRIMARY KEY ("ID")
);
COMMENT ON TABLE "SAFE_NACOS"."CONFIG_INFO_AGGR" IS '增加租户字段' ;
CREATE UNIQUE INDEX "UK_CONFIGINFOAGGR_DATAGROUPTENANTDATUM" ON "SAFE_NACOS"."CONFIG_INFO_AGGR"("DATA_ID","GROUP_ID","TENANT_ID");


/******************************************/
/* 表名称 = CONFIG_INFO_BETA */
/******************************************/
CREATE TABLE "SAFE_NACOS"."CONFIG_INFO_BETA" (
"ID" BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ID',
"DATA_ID" VARCHAR(255) NOT NULL COMMENT 'DATA_ID',
"GROUP_ID" VARCHAR(128) NOT NULL COMMENT 'GROUP_ID',
"APP_NAME" VARCHAR(128) DEFAULT NULL COMMENT 'APP_NAME',
"CONTENT" Clob NOT NULL COMMENT 'CONTENT',
"BETA_IPS" VARCHAR(1024) DEFAULT NULL COMMENT 'BETAIPS',
"MD5" VARCHAR(32) DEFAULT NULL COMMENT 'MD5',
"GMT_CREATE" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
"GMT_MODIFIED" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
"SRC_USER" TEXT COMMENT 'SOURCE USER',
"SRC_IP" VARCHAR(50) DEFAULT NULL COMMENT 'SOURCE IP',
"TENANT_ID" VARCHAR(128) DEFAULT '' COMMENT '租户字段',
 "ENCRYPTED_DATA_KEY" VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '密钥',
NOT CLUSTER PRIMARY KEY ("ID")
);
COMMENT ON TABLE "SAFE_NACOS"."CONFIG_INFO_BETA" IS 'CONFIG_INFO_BETA' ;

CREATE UNIQUE INDEX "UK_CONFIGINFOBETA_DATAGROUPTENANT" ON "SAFE_NACOS"."CONFIG_INFO_BETA"("DATA_ID","GROUP_ID","TENANT_ID");


/******************************************/
/* 表名称 = CONFIG_INFO_TAG*/
/******************************************/
CREATE TABLE "SAFE_NACOS"."CONFIG_INFO_TAG" (
"ID" BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ID',
"DATA_ID" VARCHAR(255) NOT NULL COMMENT 'DATA_ID',
"GROUP_ID" VARCHAR(128) NOT NULL COMMENT 'GROUP_ID',
"TENANT_ID" VARCHAR(128) DEFAULT '' COMMENT 'TENANT_ID',
"TAG_ID" VARCHAR(128) NOT NULL COMMENT 'TAG_ID',
"APP_NAME" VARCHAR(128) DEFAULT NULL COMMENT 'APP_NAME',
"CONTENT" CLOB NOT NULL COMMENT 'CONTENT',
"MD5" VARCHAR(32) DEFAULT NULL COMMENT 'MD5',
"GMT_CREATE" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
"GMT_MODIFIED" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
"SRC_USER" TEXT COMMENT 'SOURCE USER',
"SRC_IP" VARCHAR(50) DEFAULT NULL COMMENT 'SOURCE IP',
NOT CLUSTER PRIMARY KEY ("ID")
);
COMMENT ON TABLE "SAFE_NACOS"."CONFIG_INFO_TAG" IS 'CONFIG_INFO_TAG' ;
CREATE UNIQUE INDEX "UK_CONFIGINFOTAG_DATAGROUPTENANTTAG" ON "SAFE_NACOS"."CONFIG_INFO_TAG"("DATA_ID","GROUP_ID","TENANT_ID","TAG_ID");


/******************************************/
/* 表名称 = CONFIG_TAGS_RELATION */
/******************************************/
CREATE TABLE "SAFE_NACOS"."CONFIG_TAGS_RELATION" (
"ID" BIGINT NOT NULL COMMENT 'ID',
"TAG_NAME" VARCHAR(128) NOT NULL COMMENT 'TAG_NAME',
"TAG_TYPE" VARCHAR(64) DEFAULT NULL COMMENT 'TAG_TYPE',
"DATA_ID" VARCHAR(255) NOT NULL COMMENT 'DATA_ID',
"GROUP_ID" VARCHAR(128) NOT NULL COMMENT 'GROUP_ID',
"TENANT_ID" VARCHAR(128) DEFAULT '' COMMENT 'TENANT_ID',
"NID" BIGINT NOT NULL AUTO_INCREMENT COMMENT 'NID, 自增长标识',
NOT CLUSTER PRIMARY KEY ("NID")
);
COMMENT ON TABLE "SAFE_NACOS"."CONFIG_TAGS_RELATION" IS 'CONFIG_TAG_RELATION' ;
CREATE UNIQUE INDEX "UK_CONFIGTAGRELATION_CONFIGIDTAG" ON "SAFE_NACOS"."CONFIG_TAGS_RELATION"("ID","TAG_NAME","TAG_TYPE");
CREATE INDEX "IDX_TENANT_ID" ON "SAFE_NACOS"."CONFIG_TAGS_RELATION"("TENANT_ID");


/******************************************/
/* 表名称 = GROUP_CAPACITY */
/******************************************/
CREATE TABLE "SAFE_NACOS"."GROUP_CAPACITY" (
"ID" BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
"GROUP_ID" VARCHAR(128) NOT NULL DEFAULT '' COMMENT 'GROUP ID,空字符表示整个集群',
"QUOTA" INT  NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
"USAGE" INT  NOT NULL DEFAULT '0' COMMENT '使用量',
"MAX_SIZE" INT  NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
"MAX_AGGR_COUNT" INT  NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
"MAX_AGGR_SIZE" INT  NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
"MAX_HISTORY_COUNT" INT  NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
"GMT_CREATE" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
"GMT_MODIFIED" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
NOT CLUSTER PRIMARY KEY ("ID")
);
COMMENT ON TABLE "SAFE_NACOS"."GROUP_CAPACITY" IS '集群、各GROUP容量信息表' ;
CREATE UNIQUE INDEX "UK_GROUP_ID" ON "SAFE_NACOS"."GROUP_CAPACITY"("GROUP_ID");

/******************************************/
/* 表名称 = HIS_CONFIG_INFO*/
/******************************************/
CREATE TABLE "SAFE_NACOS"."HIS_CONFIG_INFO" (
"ID" BIGINT  NOT NULL COMMENT 'ID',
"NID" BIGINT  NOT NULL AUTO_INCREMENT COMMENT 'NID, 自增标识',
"DATA_ID" VARCHAR(255) NOT NULL COMMENT 'DATA_ID',
"GROUP_ID" VARCHAR(128) NOT NULL COMMENT 'GROUP_ID',
"APP_NAME" VARCHAR(128) DEFAULT NULL COMMENT 'APP_NAME',
"CONTENT" CLOB NOT NULL COMMENT 'CONTENT',
"MD5" VARCHAR(32) DEFAULT NULL COMMENT 'MD5',
"GMT_CREATE" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
"GMT_MODIFIED" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
"SRC_USER" TEXT COMMENT 'SOURCE USER',
"SRC_IP" VARCHAR(50) DEFAULT NULL COMMENT 'SOURCE IP',
"OP_TYPE" CHAR(10) DEFAULT NULL COMMENT 'OPERATION TYPE',
"TENANT_ID" VARCHAR(128) DEFAULT '' COMMENT '租户字段',
 "ENCRYPTED_DATA_KEY" VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '密钥',
PRIMARY KEY ("NID")
);
COMMENT ON TABLE "SAFE_NACOS"."HIS_CONFIG_INFO" IS '多租户改造' ;
CREATE INDEX "IDX_GMT_CREATE" ON "SAFE_NACOS"."HIS_CONFIG_INFO"("GMT_CREATE");
CREATE INDEX "IDX_GMT_MODIFIED" ON "SAFE_NACOS"."HIS_CONFIG_INFO"("GMT_MODIFIED");
CREATE INDEX "IDX_DID" ON "SAFE_NACOS"."HIS_CONFIG_INFO"("DATA_ID");

/******************************************/
/* 表名称 = TENANT_CAPACITY*/
/******************************************/
CREATE TABLE "SAFE_NACOS"."TENANT_CAPACITY" (
"ID" BIGINT  NOT NULL AUTO_INCREMENT COMMENT '主键ID',
"TENANT_ID" VARCHAR(128) NOT NULL DEFAULT '' COMMENT 'TENANT ID',
"QUOTA" INT  NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
"USAGE" INT  NOT NULL DEFAULT '0' COMMENT '使用量',
"MAX_SIZE" INT  NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
"MAX_AGGR_COUNT" INT  NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
"MAX_AGGR_SIZE" INT  NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
"MAX_HISTORY_COUNT" INT  NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
"GMT_CREATE" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
"GMT_MODIFIED" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY ("ID")
);
COMMENT ON TABLE "SAFE_NACOS"."TENANT_CAPACITY" IS '租户容量信息表' ;
CREATE UNIQUE INDEX "UK_TENANT_ID" ON "SAFE_NACOS"."TENANT_CAPACITY"("TENANT_ID");


CREATE TABLE "SAFE_NACOS"."TENANT_INFO" (
"ID" BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ID',
"KP" VARCHAR(128) NOT NULL COMMENT 'KP',
"TENANT_ID" VARCHAR(128) DEFAULT '' COMMENT 'TENANT_ID',
"TENANT_NAME" VARCHAR(128) DEFAULT '' COMMENT 'TENANT_NAME',
"TENANT_DESC" VARCHAR(256) DEFAULT NULL COMMENT 'TENANT_DESC',
"CREATE_SOURCE" VARCHAR(32) DEFAULT NULL COMMENT 'CREATE_SOURCE',
"GMT_CREATE" BIGINT NOT NULL COMMENT '创建时间',
"GMT_MODIFIED" BIGINT NOT NULL COMMENT '修改时间',
PRIMARY KEY ("ID")
);

COMMENT ON TABLE "SAFE_NACOS"."TENANT_INFO" IS 'TENANT_INFO' ;
CREATE UNIQUE INDEX "UK_TENANT_INFO_KPTENANTID" ON "SAFE_NACOS"."TENANT_INFO"("KP","TENANT_ID");
CREATE INDEX "IDX_TENANTIN_ID" ON "SAFE_NACOS"."TENANT_INFO"("TENANT_ID");

CREATE TABLE "SAFE_NACOS"."USERS" (
"ID" BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ID',
	"USERNAME" VARCHAR(50) NOT NULL COMMENT 'USERNAME',
	"PASSWORD" VARCHAR(500) NOT NULL COMMENT 'PASSWORD',
	"ENABLED" int NOT NULL COMMENT 'ENABLED',
PRIMARY KEY ("ID")
);

CREATE TABLE "SAFE_NACOS"."ROLES" (
"ID" BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ID',
	"USERNAME" VARCHAR(50) NOT NULL COMMENT 'USERNAME',
	"ROLE" VARCHAR(50) NOT NULL COMMENT 'ROLE',
PRIMARY KEY ("ID")
);
CREATE UNIQUE INDEX "IDX_USER_ROLE" ON "SAFE_NACOS"."ROLES" ("USERNAME" ASC, "ROLE" ASC);

CREATE TABLE "SAFE_NACOS"."PERMISSIONS" (
"ID" BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ID',
"ROLE" VARCHAR(50) NOT NULL COMMENT 'ROLE',
"RESOURCE" VARCHAR(128) NOT NULL COMMENT 'RESOURCE',
"ACTION" VARCHAR(8) NOT NULL COMMENT 'ACTION',
PRIMARY KEY ("ID")
);
CREATE UNIQUE INDEX "UK_ROLE_PERMISSION" ON "SAFE_NACOS"."PERMISSIONS" ("ROLE","RESOURCE","ACTION");

INSERT INTO "SAFE_NACOS".users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO "SAFE_NACOS".roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

二、nacos适配达梦数据库

这里以nacos-2.1.0为例子

2.1 下载nacos2.1.0源码

可参考:GitHub - alibaba/nacos at 2.1.0

2.2  修改nacos源码适配达梦数据库

2.2.1 引入达梦驱动依赖

首先在根目录的pom.xml中引入达梦数据库依赖

<dm-connector-java.version>8.1.1.49</dm-connector-java.version>

<dependency>

                <groupId>com.dameng</groupId>

                <artifactId>Dm8JdbcDriver18</artifactId>

                <version>${dm-connector-java.version}</version>

</dependency>

2.2.2 修改nacos-config模块下的ExternalDataSourceProperties

具体代码如下: 

/*
 * Copyright 1999-2018 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */

package com.alibaba.nacos.config.server.service.datasource;

import com.alibaba.nacos.common.utils.Preconditions;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.core.env.Environment;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

import static com.alibaba.nacos.common.utils.CollectionUtils.getOrDefault;

/**
 * Properties of external DataSource.
 *
 * @author Nacos
 */
public class ExternalDataSourceProperties {

    private static final String JDBC_DRIVER_NAME = "com.mysql.cj.jdbc.Driver";

    private static final String TEST_QUERY = "SELECT 1";

    private Integer num;

    private String jdbcDriverName;

    private List<String> url = new ArrayList<>();

    private List<String> user = new ArrayList<>();

    private List<String> password = new ArrayList<>();

    public void setNum(Integer num) {
        this.num = num;
    }

    public void setUrl(List<String> url) {
        this.url = url;
    }

    public void setUser(List<String> user) {
        this.user = user;
    }

    public void setPassword(List<String> password) {
        this.password = password;
    }

    public String getJdbcDriverName() {
        return jdbcDriverName;
    }

    public void setJdbcDriverName(String jdbcDriverName) {
        this.jdbcDriverName = jdbcDriverName;
    }

    /**
     * Build serveral HikariDataSource.
     *
     * @param environment {@link Environment}
     * @param callback    Callback function when constructing data source
     * @return List of {@link HikariDataSource}
     */
    List<HikariDataSource> build(Environment environment, Callback<HikariDataSource> callback) {
        List<HikariDataSource> dataSources = new ArrayList<>();
        Binder.get(environment).bind("db", Bindable.ofInstance(this));
        Preconditions.checkArgument(Objects.nonNull(num), "db.num is null");
        Preconditions.checkArgument(CollectionUtils.isNotEmpty(user), "db.user or db.user.[index] is null");
        Preconditions.checkArgument(CollectionUtils.isNotEmpty(password), "db.password or db.password.[index] is null");
        for (int index = 0; index < num; index++) {
            int currentSize = index + 1;
            Preconditions.checkArgument(url.size() >= currentSize, "db.url.%s is null", index);
            DataSourcePoolProperties poolProperties = DataSourcePoolProperties.build(environment);
            poolProperties.setDriverClassName(JDBC_DRIVER_NAME);
            poolProperties.setJdbcUrl(url.get(index).trim());
            poolProperties.setUsername(getOrDefault(user, index, user.get(0)).trim());
            poolProperties.setPassword(getOrDefault(password, index, password.get(0)).trim());
            HikariDataSource ds = poolProperties.getDataSource();
            ds.setConnectionTestQuery(TEST_QUERY);
            ds.setIdleTimeout(TimeUnit.MINUTES.toMillis(10L));
            ds.setConnectionTimeout(TimeUnit.SECONDS.toMillis(3L));
            System.out.println("#################################");
            System.out.println("jdbcDriverName=" + jdbcDriverName);
            if (StringUtils.isNotEmpty(jdbcDriverName)) {
                // 增加其他数据库驱动的支持
                ds.setDriverClassName(jdbcDriverName);
            } else {
                //默认使用mysql驱动
                ds.setDriverClassName(JDBC_DRIVER_NAME);
            }
            System.out.println("#################################");
            System.out.println("dataSources=" + dataSources);
            dataSources.add(ds);
            callback.accept(ds);
        }
        Preconditions.checkArgument(CollectionUtils.isNotEmpty(dataSources), "no datasource available");
        return dataSources;
    }

    interface Callback<D> {

        /**
         * Perform custom logic.
         *
         * @param datasource dataSource.
         */
        void accept(D datasource);
    }
}
2.2.3 修改nacos-console模块下的application.properties

### Count of DB:

db.num=1

db.jdbcDriverName=dm.jdbc.driver.DmDriver

db.url.0=jdbc:dm://10.136.xxx.xxx:5237?schema=SAFE_NACOS&characterEncoding=UTF-8&useUnicode=true&serverTimezone=Asia/Shanghai

db.user=SAFE_NACOS

db.password=Safehub@2024

2.3 重新打包nacos

在nacos项目下打开终端输入以下命令

mvn -Prelease-nacos -Dmaven.test.skip=true -Dpmd.skip=true -Dcheckstyle.skip=true clean install -U

运行成功后会在/nacos/distribution/target目录下生成如下文件

至此,新的nacos已改造完成。

三、制作nacos-dm.tar镜像

3.1 编写Dockerfile文件

vi  Dockerfile

FROM java:8

MAINTAINER wx

ENV JAVA_HOME=/usr/lib/jvm/jdk1.8.0_181

ENV PATH=$PATH:$JAVA_HOME/bin

ENV LC_ALL=en_US.utf8

ENV LANG=en_US.utf8

ENV LANGUAGE=en_US.utf8

ADD nacos-server.jar app.jar

EXPOSE 8848

ENTRYPOINT ["java", "-Dfile.encoding=utf-8","-jar", "app.jar"]

PS:docker已有基础镜像java:8

3.2 编写构建镜像脚本

vi nacos_built.sh(PS:Dockerfile和jar包在同一目录下)

app_name='nacos-dm'

docker stop ${app_name}

docker rm -f ${app_name}

sleep 2

docker build -t nacos-dm .

3.3 启动nacos-dm容器

3.3.1 创建/home/nacos/mydata/conf//home/nacos/mydata/logs目录

并将下面两个文件copy进/home/nacos/mydata/conf/

3.3.2 修改application.properties文件


application.properties完整内容如下:

# spring

server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}

server.contextPath=/nacos

server.port=${NACOS_APPLICATION_PORT:8848}

server.tomcat.accesslog.max-days=30

server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i

server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}

server.error.include-message=ALWAYS

# default current work dir

server.tomcat.basedir=file:.

#*************** Config Module Related Configurations ***************#

### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.

#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}

spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:dm}

nacos.cmdb.dumpTaskInterval=3600

nacos.cmdb.eventTaskInterval=10

nacos.cmdb.labelTaskInterval=300

nacos.cmdb.loadDataAtStart=false

db,jdbcDriverName=${DM_DRIVER:dm.jdbc.driver.DmDriver}

db.num=${MYSQL_DATABASE_NUM:1}

db.url.0=jdbc:dm://${MYSQL_SERVICE_HOST:10.136.xxx.xx}:${MYSQL_SERVICE_PORT:5237}/${MYSQL_SERVICE_DB_NAME:SAFE_NACOS}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}

db.user.0=${MYSQL_SERVICE_USER:SAFE_NACOS}

db.password.0=${MYSQL_SERVICE_PASSWORD:Safehub@2024}

### The auth system to use, currently only 'nacos' and 'ldap' is supported:

nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}

### worked when nacos.core.auth.system.type=nacos

### The token expiration in seconds:

nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}

### The default token:

nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey01234567890123456789012345345678999987654901234567890123456789}

### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.

nacos.core.auth.enable=true

nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}

nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}

nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:example}

nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:example}

## spring security config

### turn off security

nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}

# metrics for elastic search

management.metrics.export.elastic.enabled=false

management.metrics.export.influx.enabled=false

nacos.naming.distro.taskDispatchThreadCount=10

nacos.naming.distro.taskDispatchPeriod=200

nacos.naming.distro.batchSyncKeyCount=1000

nacos.naming.distro.initDataRatio=0.9

nacos.naming.distro.syncRetryDelay=5000

nacos.naming.data.warmup=true

3.3.3 编写cluster.conf

目前内容为空

3.4 编写启动脚本

vi docker-startup.sh

app_name='nacos-dm'

docker stop ${app_name}

echo '--------stop container-------------'

docker rm ${app_name}

echo '--------rm container---------------'

docker run -p 8848:8848 --name ${app_name} \

        -e MODE=standalone \

        -e TZ="Asia/Shanghai"\

        --restart always\

        -v /etc/localtime:/etc/localtime \

        -v /home/nacos/mydata/conf/:/root/nacos/conf/ \

        -v /home/nacos/mydata/logs/:/root/nacos/logs \

        -d ${app_name}

echo '---------start container---------'

3.5 打成tar包

docker save -o nacos-dm.tar nacos-dm

四、遇到的问题

4.1 出现错误:[Too many errors, abort] [error occurred during error reporting , id 0xb] 

可能是docker容器问题,添加docker内存配置:

vi /etc/profile

ulimit -n 65535

vi /etc/systemd/system/docker.service

ExecReload=/bin/kill -s HUP $MAINPID

LimitNOFILE=65535

LimitNPROC=65535

LimitCORE=65535

然后重启加载配置并启动

systemctl daemon-reload

systemctl restart docker

4.2 container_linux.go:318 permission denied””: unknown

改写启动脚本,增加:--privileged=true

app_name='nacos-dm'
docker stop ${app_name}
echo '--------stop container-------------'

docker rm ${app_name}
echo '--------rm container---------------'

docker run -p 8848:8848 --name ${app_name} \
        -e MODE=standalone \
        -m 3g \
        --privileged=true \
    -e TZ="Asia/Shanghai" \
        --restart always \
    -v /etc/localtime:/etc/localtime \
        -v /home/nacos/mydata/conf/:/root/nacos/conf/ \
    -v /home/nacos/mydata/logs/:/root/nacos/logs \
    -d ${app_name}

echo '---------start container---------'

五、使用现成的nacos-dm.tar, 部署适配过达梦数据库的nacos服务

5.1 上传nacos-dm.tar镜像

5.2 上传docker-startup.sh启动脚本

5.3 在/home/目录下创建nacos/mydata/conf,nacos/mydata/logs目录

cd /home

mkdir -p {nacos/mydata/conf,nacos/mydata/logs}

5.4 在/home/nacos/mydata/conf目录下上传application.properties、cluster.conf文件

最终如下图:

ps:docker-startup.sh,application.properties,cluster.conf内容见上文(三、制作nacos-dm.tar镜像)

5.5 加载镜像

docker load < nacos-dm.tar

5.6 启动nacos容器

sh docker-startup.sh

5.7 查看nacos服务是否启动成功

docker logs --tail=400 -f nacos-dm

5.8 在浏览器输入地址

http://10.136.xx.xxx:8848/nacos/#

ps: nacos默认用户名nacos/nacos

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pythonGame-实现简单的贪食蛇游戏

通过python简单复现贪食蛇游戏。 使用到的库函数&#xff1a; import pygame import time import random 游戏源码&#xff1a; import pygame import time import randompygame.init()white (255, 255, 255) yellow (255, 255, 102) black (0, 0, 0) red (213, 50, 80…

【秋招突围】2024届秋招笔试-美团笔试题-第一套-三语言题解(Java/Cpp/Python)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新 美团 春秋招笔试题**汇总~ 👏 感谢大家的订阅➕ 和 喜欢💗 01.LYA 的音乐播放列表 问题描述 LYA 有一个包含 n n n 首歌曲的音乐播放列表,歌曲编号从 1 1

护网紧急情况应对指南:Linux 应急响应手册

继上一篇&#xff1a;护网紧急情况应对指南&#xff1a;Windows版v1.2全新升级版 之后 收到小伙伴后台要Linux应急手册&#xff0c;今天给大家安排上。 《Linux应急手册》是一本为Linux系统管理员和运维工程师量身打造的实用指南&#xff0c;旨在帮助他们快速应对各种突发状况…

电测量数据交换DLMSCOSEM组件第10部分:智能测量标准化框架

1.GB/T 17215.6XY系列 IEC 62056 DLMS/COSEM组件标准已经由IEC/TC 13完成制定,用于电测量的目的。有些标准——特别是COSEM数据模型——也已经被其他非电量测量的技术委员会使用。IEC62056-X-Y系列标准对应转换国标GB/T 17215.6XY系列(电测量数据交换DLMSCOSEM组件)。如下图…

Electron的入门介绍与使用(1)共30节

Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 入门指南​ Electron 是网页应用 …

repo 工具安装和使用教程(windows+gitee)

repo是什么 官方的定义&#xff1a;Repo是谷歌用python脚本写的调用git的一个脚本&#xff0c;可以实现管理多个git库。 Android的源代码使用Repo 命令行工具来管理多个git仓库&#xff0c;大概有百多个。要想克隆和管理百多个 Git 仓库&#xff0c;不是一件简单的事情。Repo 命…

Java集合——HashMap的底层实现

HashMap将数据以键值对的形式存储&#xff0c;是线程不安全的&#xff08;即在多线程中若不用concurrentHashMap会导致结果错误&#xff09;。 // concurrentHashMap编程示例 import java.util.Map; import java.util.concurrent.ConcurrentHashMap;public class HashMapThrea…

快手电商Android一面凉经(2024)

快手电商Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《快手电商Android一面凉经(2024)》。 面试职位: Android工程师 技术一面 面试形式…

新手小白的pytorch学习第十四弹------十一、十二、十三弹卷积神经网络CNN的习题

习题编号目录 No 1No 2No 3No 4No 5No 6No 7No 8No 9No 10No 11No 12No 13 练习题主要就是 写代码&#xff0c;所以这篇文章大部分是代码哟~ No 1 What are 3 areas in industry where computer vision is currently being used? No 2 工业异常检测&#xff0c;目标检测 Sea…

C语言 -- sizeof和strlen的用法

C语言 -- sizeof和strlen的用法 1. sizeof和strlen的对比​1.1 sizeof​1.2 strlen​1.3 sizeof 和 strlen的对比​ 2. 数组和指针笔试题解析2.1 一维数组​2.2 字符数组​2.3 二维数组 3. 指针运算笔试题解析3.1 题目1&#xff1a;3.2 题目2​3.3 题目3​3.4 题目4​3.5 题目5…

力扣高频SQL 50题(基础版)第十九题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第十九题1211. 查询结果的质量和占比题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第十九题 1211. 查询结果的质量和占比 题目说明 Queries 表&#xff1a; …

学习c语言第十五天(初阶测评)

选择题 1.下列程序输出结果为 67 2.下列程序输出结果为 死循环打印 3.i 和j的值分别为什么 2 1 4.k的终值是什么 90 5.输出结果是什么 1 6.正确的是 C 7. C语言规定main函数位置 C 8.不正确的是 D 9.正确的是 c 库函数独立c语言之外 10…

comsol在静水压力下的地应力平衡

comsol在静水压力下的地应力平衡 条件: 水深3m,粗砂层厚度10m,模型长度100m土体的饱和密度1950kg/m3水的密度1000kg/m3浮重度 γ ′ = γ s a t − γ w \gamma=\gamma_{sat}-\gamma_w γ

GD32 PWM输入捕获

前言 通过本次的学习&#xff0c;了解定时器的分类和配置&#xff0c;高级定时器&#xff0c;通用定时器等不同等级的定时器拥有的功能&#xff0c;学习定时器的输入捕获与输出比较功能&#xff08;PWM&#xff09;脉冲宽度调制&#xff0c;来控制电机等外设。 定义 定时器的分…

Pytorch学习笔记——在GPU上进行训练

文章目录 1. 环境准备2. 导入必要库3. 加载数据集4. 定义简单的神经网络模型5. 检查和设置GPU设备6. 定义损失函数和优化器7. 训练模型8. 全部代码展示及运行结果 1. 环境准备 首先&#xff0c;确保PyTorch已经安装&#xff0c;且CUDA&#xff08;NVIDIA的并行计算平台和编程模…

go-kratos 学习笔记(6) 数据库gorm使用

数据库是项目的核心&#xff0c;数据库的链接数据是data层的操作&#xff0c;选择了比较简单好用的gorm作为数据库的工具&#xff1b;之前是PHP开发&#xff0c;各种框架都是orm的操作&#xff1b;gorm还是很相似的&#xff0c;使用起来比较顺手 go-kratos官网的实例是ent&…

鸿蒙UI系统组件10——菜单(Menu)

果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下面名片&#xff0c;关注公众号。 Menu是菜单接口&#xff0c;一般用于鼠标右键弹窗、点击弹窗等。 1、创建默认样式的菜单 菜单需要调用bindMenu接口来实现。bindMenu响应绑定组件的点击事件&am…

ModuleNotFoundError: No module named ‘py3langid‘ 以及如何将包安在虚拟环境下

前提&#xff1a;已经安装过改包&#xff08;pip install py3langid&#xff09;&#xff0c;但仍报错 原因&#xff1a;安装在其他目录下了 解决办法&#xff1a; 1、再次在终端输入pip install py3langid 显示安装位置 Requirement already satisfied: py3langid in c:\…

css大屏设置中间元素四周渐变透明效果

css大屏设置中间元素四周渐变透明效果 四周透明效果&#xff1a; // 设置蒙版上下左右渐变显示mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%, rgba(0, 0, 0, 1) 90%, rgba(0, 0, 0, 0) 100%),linear-gradient(to bottom, rgba(0, 0, 0…

性能测试的指标及流程

性能测试指标 相应时间 并发数 吞吐量&#xff1a; 点击数 错误率 资源使用率 所有的东西是存在磁盘里的&#xff0c;在代码运行的时候会将磁盘的东西读取到内存里&#xff0c;磁盘IO和网络都是衡量速度&#xff0c;在任务管理器可查看资源使用率 题&#xff1a; 答案&#xf…