应用分享 | 基于NEXUS3的仓库私服

应用名称:nexus3

简述:基于官方 sonatype/nexus3 镜像制作的云市应用,一键部署属于自己的仓库私服。

版本:3.14.0

源码地址:https://github.com/goodrain-apps/docker-nexus3.git Branch:app

关于nexus3

Nexus Repository OSS是一个开源存储库。通过Nexus工具集成,工具链中的管道可以使用可从其他环境访问的中央存储库来发布和检索版本化应用程序及其依赖项。

标签:

  • 用于管理所有流行组件格式的集中存储库
  • 所有二进制文件和构建工件的单一事实来源
  • 深入了解组件安全性,许可证和质量问题
  • 存储和分发Maven / Java,npm,NuGet,RubyGems,Docker,P2,OBR,APT,YUM等
  • 从开发到交付管理组件:二进制文件,容器,程序集和成品
  • 对Java虚拟机(JVM)生态系统的强大支持,包括Gradle,Ant, Maven 和Ivy
  • 兼容Eclipse,IntelliJ,Hudson,Jenkins,Puppet,Chef,Docker等流行工具

官方网站:https://www.sonatype.com/nexus-repository-oss

制作流程

我们基于官方提供的docker镜像,制作了这款云市应用。针对平台特性做出了一点修改,这些修改并没有影响到软件本身的功能,使用者可以按照官方文档指定的方式来配置nexus3。

###创建Dockerfile

首先创建源码仓库并创建Dockerfile

内容如下:

FROM       sonatype/nexus3

MAINTAINER guox <guox@goodrain.com>

USER root

ENV TZ=Asia/Shanghai

COPY memset.sh /

RUN sed -i -e "2 a. /memset.sh" \
           -e '3 aINSTALL4J_ADD_VM_PARAMS="${JAVA_OPTS} -Djava.util.prefs.userRoot=${NEXUS_DATA}/javaprefs"' ${SONATYPE_DIR}/start-nexus-repository-manager.sh

VOLUME ["/nexus-data"]

EXPOSE 8081

CMD ["sh", "-c", "${SONATYPE_DIR}/start-nexus-repository-manager.sh"]

对于该Dockerfile详细讲解如下:

FROM sonatype/nexus3 指定基础镜像,这是由官方提供的Nexus3 OSS版本的镜像。

USER root 指定镜像的用户为root,这可以使后面步骤中的一些命令正确执行,避免权限问题。

ENV TZ=Asia/Shanghai 指定时区,由于很多基础镜像是国外制作的,为了使容器内的时间具备参考价值,需要替换时区。

COPY memset.sh /

RUN sed -i -e "2 a. /memset.sh" \
           -e '3 aINSTALL4J_ADD_VM_PARAMS="${JAVA_OPTS} -Djava.util.prefs.userRoot=${NEXUS_DATA}/javaprefs"' ${SONATYPE_DIR}/start-nexus-repository-manager.sh

脚本 memset.sh 是Rainbond为了设置JVM内存而制作的,通过将该脚本加入Nexus的启动脚本,生成环境变量 ${JAVA_OPTS} 。进而定制了环境变量 ${INSTALL4J_ADD_VM_PARAMS} 的内容,这样Nexus启动时,JVM内存就会随着Rainbond应用设置的内存大小而改变,防止了内存泄露的风险。

memset.sh 文件内容:

# set default_java_mem_opts
case ${MEMORY_SIZE:-small} in
    "micro")
       export default_java_mem_opts="-Xms90m -Xmx90m -Xss512k  -XX:MaxDirectMemorySize=12M"
       echo "Optimizing java process for 128M Memory...." >&2
       ;;
    "small")
       export default_java_mem_opts="-Xms180m -Xmx180m -Xss512k -XX:MaxDirectMemorySize=24M "
       echo "Optimizing java process for 256M Memory...." >&2
       ;;
    "medium")
       export default_java_mem_opts="-Xms360m -Xmx360m -Xss512k -XX:MaxDirectMemorySize=48M"
       echo "Optimizing java process for 512M Memory...." >&2
       ;;
    "large")
       export default_java_mem_opts="-Xms720m -Xmx720m -Xss512k -XX:MaxDirectMemorySize=96M "
       echo "Optimizing java process for 1G Memory...." >&2
       ;;
    "2xlarge")
       export default_java_mem_opts="-Xms1420m -Xmx1420m -Xss512k -XX:MaxDirectMemorySize=192M"
       echo "Optimizing java process for 2G Memory...." >&2
       ;;
    "4xlarge")
       export default_java_mem_opts="-Xms2840m -Xmx2840m -Xss512k -XX:MaxDirectMemorySize=384M "
       echo "Optimizing java process for 4G Memory...." >&2
       ;;
    "8xlarge")
       export default_java_mem_opts="-Xms5680m -Xmx5680m -Xss512k -XX:MaxDirectMemorySize=768M"
       echo "Optimizing java process for 8G Memory...." >&2
       ;;
    16xlarge|32xlarge|64xlarge)
       export default_java_mem_opts="-Xms8G -Xmx8G -Xss512k -XX:MaxDirectMemorySize=1536M"
       echo "Optimizing java process for biger Memory...." >&2
       ;;
    *)
       export default_java_mem_opts="-Xms128m -Xmx128m -Xss512k -XX:MaxDirectMemorySize=24M"
       echo "Optimizing java process for 256M Memory...." >&2
       ;;
esac

if [[ "${JAVA_OPTS}" == *-Xmx* ]]; then
  export JAVA_TOOL_OPTIONS=${JAVA_TOOL_OPTIONS:-"-Dfile.encoding=UTF-8"}
else
  default_java_opts="${default_java_mem_opts} -Dfile.encoding=UTF-8"
  export JAVA_OPTS="${default_java_opts} $JAVA_OPTS"
fi

强烈建议所有的基于JAVA JVM的应用添加这一设置。

VOLUME ["$/nexus-data"] 指定持久化数据卷。

EXPOSE 8081 指定服务端口。

CMD ["sh", "-c", "${SONATYPE_DIR}/start-nexus-repository-manager.sh"] 指定启动命令。

Rainbond部署

完成了Dockerfile,就可以根据源码进行部署了:

部署完成后,可以访问应用来检验是否部署成功:

检验无误后,发布应用:

在企业中心进行上架后,应用就发布成功了。

其它事项

默认用户名:admin
默认密码:admin123