DevOps CI/CD 分析(二)之编写Dockerfile文件

本节我们开始编写Dockerfile文件,编写Dockerfile所涉及相关命令都在前面的文章进行过讲解,如果对Dockerfile基础命令不熟悉可以参阅DevOps CI/CD 分析(一)之Dockerfile基础命令,熟悉基础命令之后,可以让我们快速理解本节的内容!


Dockerfile

FROM maven:3.6.1-jdk-8 AS mavenBuilder
MAINTAINER userName <email@gmail.com>
WORKDIR /mavenBuild
ENV MAVEN_REPO "-Dmaven.repo.local=/mavenBuild/.m2"
ARG PROJECT_SERVER_DIR
ADD ./ /mavenBuild/
RUN mvn $MAVEN_REPO clean package
RUN cp $PROJECT_SERVER_DIR/target/*.jar /server.jar

FROM registry-vpc.cn-beijing.aliyuncs.com/company/openjdk:8u222-jdk-v1.2
WORKDIR /data
ENV SERVER_PORT 80
EXPOSE $SERVER_PORT
ENV RAMPERCENTAGE 75.0
COPY --from=mavenBuilder /mavenBuild/entrypoint.sh /data/entrypoint.sh
RUN chmod +x /data/entrypoint.sh && \
    groupadd -r java_group && \
    useradd -m -r -g java_group java_user
COPY --from=mavenBuilder server.jar /data/server.jar
RUN chown -R java_user:java_group /data
USER java_user:java_group
ENTRYPOINT ["/data/entrypoint.sh"]

代码块中展示了Dockerfile文件的内容,或许单看这个Dockerfile文件内容,不利于理解,所以为了帮助大家更好的理解整个Dockerfile文件内容,下面我们对每一行都进行讲解!


Dockerfile内容详解

  1. FROM maven:3.6.1-jdk-8 AS mavenBuilder 指定基础镜像,扩展的基础镜像,在遇到下一个FROM命令之前,我们的命令执行都在这个基础镜像中,然后我们给这个基础镜像起一个mavenBuilder别名,便于后续使用。
  2. MAINTAINER userName email@gmail.com 指定镜像的作者,主要是用于标志而已。
  3. WORKDIR /mavenBuild 指定我们执行RUN命令的工作目录,因为我们这个基础镜像是需要编译我们的Java项目,所以我们指定一个mavenBuild目录用于编译。
  4. ENV MAVEN_REPO "-Dmaven.repo.local=/mavenBuild/.m2" 设置一个环境变量,主要是用于设置我们执行maven的仓库目录,我们的maven仓库也还是放到/mavenBuild/.m2 这个目录中。
  5. ARG PROJECT_SERVER_DIR 定义一个参数,因为我们的每个项目的路径是不同的,所以需要定义一个参数,在gitlab-ci.yml文件中执行docker build --build-arg PROJECT_SERVER_DIR=项目路径,执行docker build时传入进来的。
  6. ADD ./ /mavenBuild/ 将当前主机目录中的文件添加到我们mavenBuilder这个基础镜像中,也就是把我们项目源代码等文件添加到/mavenBuild/这个目录。
  7. RUN mvn $MAVEN_REPO clean package 执行maven命令编译项目,我们可以看见我们使用$ 这个符号来使用我们之前定义的值。
  8. RUN cp $PROJECT_SERVER_DIR/target/*.jar /server.jar 将我们编译完成的jar包文件拷贝到基础镜像的/server.jar中。
  9. FROM registry-vpc.cn-beijing.aliyuncs.com/company/openjdk:8u222-jdk-v1.2 指定我们的运行环境的基础镜像了,这里我们是基于阿里云的openjdk:8u222-jdk-v1.2基础镜像。其中company 这个值需要替换成真实的路径。
  10. WORKDIR /data 指定工作目录,我们目前是使用基础openjdk:8u222-jdk-v1.2的 /data目录
  11. ENV SERVER_PORT 80 定义我们的端口环境变量值
  12. EXPOSE $SERVER_PORT 设置openjdk:8u222-jdk-v1.2容器内的进程对外开放的端口,这里我们开放的是80端口。
  13. ENV RAMPERCENTAGE 75.0 设置一个JVM相关的配置,这个参数会在entrypoint.sh中用到,下文会解释参数的作用。
  14. COPY --from=mavenBuilder /mavenBuild/entrypoint.sh /data/entrypoint.sh 我们通过--from=mavenBuilder 指定要从哪个镜像中拷贝文件,这里我们从mavenBuilder这个镜像中拷贝/mavenBuild/entrypoint.sh到openjdk:8u222-jdk-v1.2这个镜像的/data/entrypoint.sh目录。
  15. RUN chmod +x /data/entrypoint.sh &&
    groupadd -r java_group &&
    useradd -m -r -g java_group java_user 一个shell命令,增加一个java_group的组,然后给这个组添加一个用户为java_user,然后设置这个java_group组的java_user具备/data/entrypoint.sh 脚本执行权限
  16. COPY --from=mavenBuilder server.jar /data/server.jar 从mavenBuilder镜像中拷贝server.jar到openjdk:8u222-jdk-v1.2镜像的/data/server.jar 文件中。
  17. RUN chown -R java_user:java_group /data 将指定文件的拥有者改为指定的用户或组,这里我们就把/data这个文件指定给了 java_user:java_group这个组的用户。
  18. USER java_user:java_group 设置容器启动时的用户。
  19. ENTRYPOINT ["/data/entrypoint.sh"] 容器启动时执行的命令 ,entrypoint.sh脚本文件往下看。

entrypoint.sh

#!/bin/sh
## shell打印字体加粗和绿色
GREEN="\033[1;32m"
END="\033[0m"
JAVA_OPTS="-DJM.LOG.PATH=/data/logs -DJM.SNAPSHOT.PATH=/data/logs"

echoWrap() {
    echo "${GREEN}$1${END}"
}

echoWrap "entrypoint.sh begin running"
if [ $RAMPERCENTAGE ]; then
    echoWrap "append RAMPERCENTAGE $RAMPERCENTAGE to JAVA_OPTS"
    JAVA_OPTS="$JAVA_OPTS -XX:InitialRAMPercentage=$RAMPERCENTAGE -XX:MaxRAMPercentage=$RAMPERCENTAGE -XX:MinRAMPercentage=$RAMPERCENTAGE"
fi

echoWrap "------------------------ running java jar -----------------------------"
java $JAVA_OPTS -jar server.jar $*

我们可以看到,ENTRYPOINT ["/data/entrypoint.sh"] 容器启动时执行的命令,在entrypoint.sh这个脚本中,我们添加了一些JVM参数,然后启动我们的server.jar 运行我们的应用程序,其中有个比较重要的一点,就是设置-XX:InitialRAMPercentage 这些参数,具体为什么要设置可以参阅至少保证容器拥有512M 的内存可以用在非heap堆内存


至此,本节的核心重点=>编写Dockerfile也告一段落,整个Dockfile文件内容也做了充分的讲解,相信这样的讲解会帮助绝大多数同学,也可以更好的理解我们后续CI/CD章节的内容!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容