JAVA 程序制作 Docker 镜像的推荐方案

一、需求描述

在制作 JAVA 应用的镜像过程中,一般情况下,我们制作出来的镜像文件都需要满足以下的需求:

  • 使用官网提供的或者基于官网提供的自定义的基础镜像作为基础
  • 设定容器的正确的时间和时区
  • 容器中采用非 root 用户权限启动应用程序
  • 指定 WEB 应用程序的端口
  • 启动容器过程中能够传递 JVMJava System Properties、程序自定义参数
二、实践步骤
  • 使用官网提供的基础镜像作为镜像基础

    • 点击此处获取笔者根据 openjdk 高度定制的 Alpine Linux + JRE8 镜像,其中包含了东八区时区设置和 ttf 绘制图片字体的设置

    • 点击此处获取官方提供的琳琅满目的镜像文件

      • OpenJDK Repository 提供的基础镜像寻找规律

        • openjdk:<version>

        • openjdk:<version>-slim

        • openjdk:<version>-apline

        关于 <version> 一般来说指定大版本号即可

        # 示例
        FROM openjdk:8-alpine
        

        关于尺寸,alpine 最小、slim 稍大、默认的最大,如果项目没有特殊需求,尽量采用最小的 alpine 版本,如果在应用程序中发现运行环境缺少某些东西,可以使用笔者提供的版本或者根据以下依据来确认:

        • 如果需要存在系统字体库,采用 slim 或者 默认版本,需要操作系统字体库的程序例如:图片验证码、PDF 导出

        • 如果需要某些 Linux 标准动态/静态链接库,那么 alpine 版本不行的情况下,尝试使用 slim 或者 默认版本,因为 alpine 是阉割版的 Linux 系统

  • 设定容器的正确的时间和时区

    • 采用笔者提供的基础镜像版本,默认就已经帮你设置好了时区和东八区时间

    • 采用官方提供的镜像默认时区都是 UTC ,我们需要在构建我们自己镜像时设置时区

      • Alpine 版本

        ENV TZ=Asia/Shanghai
        RUN set -eux && ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone
        
      • Alpine 版本(不推荐,构建镜像会很慢)

        ENV TZ=Asia/Shanghai
        RUN set -eux && apk add --no-cache --update tzdata && ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone && rm -rf /var/cache/apk/*
        
  • 容器中采用非 root 用户权限启动应用程序

    • Alpine 版本

      RUN set -eux && addgroup --gid 1000 userName && adduser --system --uid 1000 --gid 1000 --home=opt/java/ --shell=/bin/sh --disabled-password userName
      
      # 采用此用户进行操作
      USER userName
      
    • Alpine 版本

      RUN set -eux && addgroup --gid 1000 userName && adduser -S -u 1000 -g userName -h /opt/java/ -s /bin/sh -D userName
      
      # 采用此用户进行操作
      USER userName
      
  • 指定 WEB 应用程序的端口

    # Dockerfile 中指定暴露的端口
    EXPOSE 8080
    
  • 启动容器过程中能够传递 JVMJava System Properties、程序自定义参数

    # 在项目启动过程中新增参数
    docker run -p 8080:8080 -e JAVA_OPTS='-Xmx128M -Xms128M -Dabc=xyz -Ddef=aaa' 镜像名称/镜像ID
    
三、Dockerfile 样例
# From 基础镜像
FROM ramboyang/openjdk-alpine:jre-8u212-timezone

# 定义镜像创建者
LABEL maintainer=rambo1203@sina.com

# 前端界面路径
# RUN mkdir -p /opt/java/front/spring-boot-sample-web

# 后端程序路径
WORKDIR /opt/java/spring-boot-sample

COPY ./*.jar ./spring-boot-sample.jar

COPY ./libsigar-amd64-linux.so /usr/lib/

EXPOSE 8888

# 设置容器中用户组和用户
RUN set -eux && addgroup --gid 1000 Rambo && adduser -S -u 1000 -g Rambo -h /opt/java/ -s /bin/sh -D Rambo

# 采用此用户进行操作
USER Rambo

ENTRYPOINT ["java", "-jar", "./spring-boot-sample.jar"]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值