背景
在官方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"]
删除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
指定JDK镜像
由于去掉了yum安装jdk的步骤,那么需要我们手动添加一个JDK,那我们直接基于JDK的镜像来制作即可,修改第一行
FROM openjdk:8
删除源码下载步骤
每次构建时都要重新下载源码,影响构建速度,有时在内网构建还不一定能通外网,所以删除源码下载步骤
RUN wget https://github.com/alibaba/nacos/releases/download/${NACOS_VERSION}${HOT_FIX_FLAG}/nacos-server-${NACOS_VERSION}.tar.gz -P /home
去掉用到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
- 修改后
RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone
创建用户以及用户组
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"]
构建镜像并推送到私有仓库
把需要的文件拷贝到一个目录
bin
conf
Dockerfile
Dockerfile.Slim
nacos-server-2.1.1.tar.gz
在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
这样我们就构建好了nacos镜像