一、需求描述
在制作 JAVA
应用的镜像过程中,一般情况下,我们制作出来的镜像文件都需要满足以下的需求:
- 使用官网提供的或者基于官网提供的自定义的基础镜像作为基础
- 设定容器的正确的时间和时区
- 容器中采用非
root
用户权限启动应用程序 - 指定
WEB
应用程序的端口 - 启动容器过程中能够传递
JVM
、Java 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
-
启动容器过程中能够传递
JVM
、Java 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"]