• 自己手动构建nacos镜像实现非root用户启动


    背景

    在这里插入图片描述
    官方docker仓库可以找到nacos镜像并运行,为什么还要自己动手构建nacos镜像呢?因为官方的镜像不支持以非root用户启动,有时出于安全等因素考虑,希望以非root用户启动应用,那么就不得不动手自己来构建镜像。

    准备工作

    • nacos源码: https://github.com/alibaba/nacos/releases
    • 官方Dockerfile: https://github.com/nacos-group/nacos-docker.git

    修改官方Dockerfile

    原始的Dockerfile

    FROM centos:7.9.2009
    MAINTAINER pader "huangmnlove@163.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.1
    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
    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"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    删除yum安装步骤

    实测yum安装过程实在太久了,每次修改重新构建都要经过一个安装步骤,实在无法忍受,于是在Dockerfile中删除以下内容

    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
    
    • 1
    • 2
    • 3

    指定JDK镜像

    由于去掉了yum安装jdk的步骤,那么需要我们手动添加一个JDK,那我们直接基于JDK的镜像来制作即可,修改第一行

    FROM openjdk:8
    
    • 1

    删除源码下载步骤

    每次构建时都要重新下载源码,影响构建速度,有时在内网构建还不一定能通外网,所以删除源码下载步骤

    RUN wget  https://github.com/alibaba/nacos/releases/download/${NACOS_VERSION}${HOT_FIX_FLAG}/nacos-server-${NACOS_VERSION}.tar.gz -P /home
    
    • 1

    去掉用到wget和yum命令的地方

    由于yum安装步骤已经去掉,也没有了wget命令,所以用到的地方也要修改,

    • 修改前
    RUN yum autoremove -y wget \
        && ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone \
        && yum clean all
    
    • 1
    • 2
    • 3
    • 修改后
    RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone
    
    • 1

    创建用户以及用户组

    ENV APP_USER=nacos
    ENV WORK_DIR=$BASE_DIR
    RUN groupadd -g 3000 $APP_USER &&\
        useradd -g 3000 -u 3000 -d $WORK_DIR -m $APP_USER
    RUN chown -R $APP_USER.$APP_USER $WORK_DIR
    USER $APP_USER
    
    EXPOSE 8848
    ENTRYPOINT ["bin/docker-startup.sh"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    构建镜像并推送到私有仓库

    把需要的文件拷贝到一个目录

    bin
    conf
    Dockerfile
    Dockerfile.Slim
    nacos-server-2.1.1.tar.gz
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在Dockerfile所在目录执行以下命令

    docker image build --tag harbor.xxx.com/myself/nacos-server:v2.1.1 .
    docker image push harbor.xxx.com/myself/nacos-server:v2.1.1
    
    • 1
    • 2

    这样我们就构建好了nacos镜像

  • 相关阅读:
    C++ 之 string类的模拟实现
    Python OpenCV 视频抽帧处理并保存
    The 2021 ICPC Asia Nanjing Regional Contest H. Crystalfly
    pycharm 中package, directory, sources root, resources root的区别
    NoC流量控制
    提升C内功--函数栈帧的创建和销毁(动画讲解)
    新火种AI|微软扶持下一个OpenAI?Mistral AI新模型对标GPT-4,上线即挤爆
    香港服务器选纯国际线路上网稳定吗?
    .Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集
    react面试题总结
  • 原文地址:https://blog.csdn.net/friendlytkyj/article/details/126559286