我只能说,
以下这个dockerfile总结了很久,
当然,目前算是个半成品,
但对我极具参考价值!!!
注释里才是技术亮点。
# base image
# alpine的openjdk可以直接运行,但oracle jdk却需要glibc。残念。
From harbor.example.com/base/baseos/alpine-glibc:3.7-glibc2.27
# MAINTAINER
MAINTAINER XXX
#相将以下ENV合成一行,减少层数,但无论用不用等号,加斜杠,都没成功。又残念。
ENV JAVA_HOME=/usr/local/jdk1.8.0_73
ENV CLASSPATH=$JAVA_HOME/bin
ENV TOMCAT_VERSION=tomcat-8.0.14
ENV CATALINA_HOME=/usr/local/${TOMCAT_VERSION}
ENV PATH=.:${JAVA_HOME}/bin:${CATALINA_HOME}/bin:$PATH
RUN mkdir -p /xxx/temp/ \
# 统一tomcat的日志和软件包及配置目录。
&& mkdir -p /xxx/webconfigs/ \
&& mkdir -p /xxx/webapps/ \
&& mkdir -p /xxx/weblogs/ \
&& adduser x1 -D -S\
&& adduser x2 -D -S\
&& adduser x3 -D -S\
# 加指定gid和uid的用户,主要是内核不支持user namespace,就行将uid和gid和宿主机一致。
&& addgroup -g 1234 -S x4 \
&& adduser -u 5678 -D -S x4 -G x4 \
&& chown -R x4.x4 /xxx/ /xxx/ \
&& chmod 755 -R /xxx/ /xxx/ \
# 想在alpine里su,要得这样,alpine基于busybox的。
&& chmod 4755 /bin/busybox \
# 这样可以更改root密码。至于万一得已登陆docker,这样行,k8s的dashboard也行的。
&& echo -e "xxxxxx\nxxxxxx" | passwd root \
# 清空瘦身jdk大小,可以COPY到docker以后进行,当然也可以在外面瘦身jdk再COPY进docker。
# && rm -rf /usr/local/jdk1.8.0_73/*src.zip \
# /usr/local/jdk1.8.0_73/lib/missioncontrol \
# /usr/local/jdk1.8.0_73/lib/visualvm \
# /usr/local/jdk1.8.0_73/lib/*javafx* \
# /usr/local/jdk1.8.0_73/jre/lib/plugin.jar \
# /usr/local/jdk1.8.0_73/jre/lib/ext/jfxrt.jar \
# /usr/local/jdk1.8.0_73/jre/bin/javaws \
# /usr/local/jdk1.8.0_73/jre/lib/javaws.jar \
# /usr/local/jdk1.8.0_73/jre/lib/desktop \
# /usr/local/jdk1.8.0_73/jre/plugin \
# /usr/local/jdk1.8.0_73/jre/lib/deploy* \
# /usr/local/jdk1.8.0_73/jre/lib/*javafx* \
# /usr/local/jdk1.8.0_73/jre/lib/*jfx* \
# /usr/local/jdk1.8.0_73/jre/lib/amd64/libdecora_sse.so \
# /usr/local/jdk1.8.0_73/jre/lib/amd64/libprism_*.so \
# /usr/local/jdk1.8.0_73/jre/lib/amd64/libfxplugins.so \
# /usr/local/jdk1.8.0_73/jre/lib/amd64/libglass.so \
# /usr/local/jdk1.8.0_73/jre/lib/amd64/libgstreamer-lite.so \
# /usr/local/jdk1.8.0_73/jre/lib/amd64/libjavafx*.so \
# /usr/local/jdk1.8.0_73/jre/lib/amd64/libjfx*.so \
# /tmp/* /var/cache/apk/* \
&& echo "finished!!!!"
# 尴尬的是,如果内核不够新,这里想以非root访问,那么,USER x4是最后起作用,
# CP过去的总是root的权限,而chown和chmod都会将docker的images增大150m以上。
# 要是docker的软件版本能新点,COPY命令支持chown参数,就棒棒的了。
COPY tomcat-8.0.14 /home/docker/tomcat-8.0.14
COPY jdk1.8.0_73 /home/docker/jdk1.8.0_73
#如何提前在本地,作了这几个文修的,就不用CP了,还能减少几层
# COPY ["./server.xml", "/usr/local/apache-tomcat-8.0.14/conf/server.xml"]
# COPY ["./logging.properties", "/usr/local/apache-tomcat-8.0.14/conf/logging.properties"]
# COPY ["./setenv.sh", "/usr/local/apache-tomcat-8.0.14/bin/setenv.sh"]
WORKDIR ${CATALINA_HOME}
# 要是内核新点,能支持user namespace,就可以将root里的用户映射为宿主机的普通用户了。
# 而不用费尽心机的将docker的用户id,组id与宿主机里的uid,gid进行匹配。
USER x4
EXPOSE 8080
CMD ["catalina.sh", "run"]