Dockerfile和.gitlab-ci.yml文件模板(含详细注释)

天行健,君子以自强不息;地势坤,君子以厚德载物。


每个人都有惰性,但不断学习是好好生活的根本,共勉!


文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。

文章目录

  • Dockerfile
  • .gitlab-ci.yml


本篇纯作为自己以后日常使用这两个文件的备份,基于Java项目使用

完整实现Java项目自动化部署(基于GitlabCI/CD)可参考:K8S部署Java项目(Gitlab CI/CD自动化部署)

Dockerfile

#关键字和值之间可以是空格" "也可以是等号"="
#指定基础镜像,以此镜像为基础构建
FROM openjdk:8-jdk-alpine

#作者
MAINTAINER hs

#设置环境变量
#JAVA_HOME环境变量定义,即配置jdk安装目录路径,需是jdk文件全路径名
ENV JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.392.b08-4.0.3.al8.x86_64
#MAVEN环境变量定义,即maven安装的位置,需是maven全路径名
ENV MAVEN_HOME=/usr/share/maven
#配置环境变量
ENV PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
#指定容器的时区
ENV TZ=Asia/Shanghai
#应用参数
#ENV ARGS=""
#target是jar包默认的位置,但是我们在CICD打包阶段已经将jar复制到了/root/jar/k8s-project目录中
#ARG JAR_FILE=target/*.jar

#创建工作目录,此目录在CICD打包阶段已经创建
#RUN mkdir -p /root/jar/k8s-project

#设置工作目录,后续命令默认执行位置为该路径,不设置的话后续会默认当前路径为工作路径
WORKDIR /root/jar/k8s-project

#复制文件到镜像中,将本地文件或目录复制到镜像指定位置
#COPY app.jar /root/jar/k8s-project/app.jar
#COPY ${JAR_FILE} /root/jar/k8s-project/app.jar

#将app.jar添加到指定文件夹中,并自动解压缩(与COPY类似,二选一即可)
#同时因为我们已经在.gitlab-ci.yml文件中的打包阶段执行了将jar复制到/root/jar/k8s-project目录的操作,故本文件中省略复制COPY或ADD命令
#ADD target/app.jar /root/jar/k8s-project/app.jar
#ADD ${JAR_FILE} /root/jar/k8s-project/app.jar

#时区配置,可省略
#RUN ln -snf /usr/share/zonginfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

#容器入口,该命令应该是将每个字符串组合起来,nohub java -jar app.jar
ENTRYPOINT ["nohup","java","-jar","app.jar"]

#声明要监听的端口(暴露端口,容器内部的端口,这里暂时不用)
#EXPOSE 8080

.gitlab-ci.yml

#全局变量,自定义变量名和值,全局引用,方便修改
#系统变量与自定义变量的使用,以$开始的表示系统变量的引用,加${}的表示自定义变量的引用
variables:
  #harbor镜像仓库IP
  HARBOR_IP: 172.30.0.224
  #harbor镜像仓库端口
  HARBOR_PORT: 8443
  #harbor仓库URL
  HARBOR_URL: ${HARBOR_IP}:${HARBOR_PORT}
  #harbor镜像仓库账号
  HARBOR_USERNAME: admin
  #harbor镜像仓库密码
  HARBOR_PASSWORD: Harbor12345

  #用于存放项目镜像的harbor镜像仓库项目地址
  IMAGE_HARBOR_REPOSITORY: ${HARBOR_IP}:${HARBOR_PORT}/k8s-demo

  #构建的镜像名称定义
  #PROJECT_IMAGE_NAME: $CI_PROJECT_NAME-$CI_PROJECT_ID
  PROJECT_IMAGE_NAME: k8s-springboot
  #构建的镜像标签定义
  #PROJECT_IMAGE_TAG: $DEPLOY_TIME_TAG-$CI_PIPELINE_ID-$CI_COMMIT_REF_NAME
  PROJECT_IMAGE_TAG: v20240204

  #本地jar包存放位置
  #PROJECT_JAR_DIR: $HOME/.m2/$CI_PROJECT_NAME-$CI_PROJECT_ID-$CI_COMMIT_REF_NAME
  PROJECT_JAR_DIR: /root/jar/k8s-project
  #maven的依赖存放文件夹路径
  MAVEN_REPOSITORY_DIR: /root/maven/.m2
  #本地镜像存储路径(容器内)
  CI_IMAGE_DIR: /root/images
  #CI_IMAGE_DIR: /root/k8s-project/app.jar

#定义任务阶段,任务执行顺序会根据列举顺序执行,前一个stage不执行完或者报错,后面的stage不会开始,不同job相同stage的任务会并行执行
#package打包,build构建,deploy部署
stages:
  - package
  - build
  - test
  - deploy

#前置脚本,适用于全局,所有任务开始之前执行该脚本命令
before_script:
  - echo "project ci/cd task start"
  #创建目录用于存储maven依赖,仅用于测试before脚本,暂时还没用到该文件夹
  - mkdir -p ${MAVEN_REPOSITORY_DIR}


#任务部分,根据定义的stage顺序来执行任务
#如想跳过该任务,可在任务名称前加上英文句号".",如.job1-package,执行时会跳过该任务
#打包项目
job1-package:
  #任务阶段
  stage: package
  #任务引用的镜像
  image: docker:latest
  #任务执行选用的runner的标签,定义后会根据标签选用对应的runner执行任务
  tags:
    - runner-01
  #指定此job只对master分支生效
  only:
    - master
  #执行脚本,maven打包,创建文件夹,将jar包复制到文件夹中
  script:
    #提示信息打印
    - echo '打包任务开始---->清理之前的jar包,打包,将包复制到容器中'
    #1项目打包,以下5个打包方式任选其一即可,可在package前加上clean来先清理
    #- mvn package
    #- mvn clean package
    #2使用prod配置文件打包,-PprofileName表示激活指定的构建配置文件,-P后加配置文件名称
    #- mvn package -Pprod
    #3跳过测试打包,-Dmaven.test.skip=true表示跳过单元测试
    - mvn clean package -Dmaven.test.skip=true
    #4清空并打包,跳过单元测试
    #- mvn clean package -Dmaven.test.skip=true
    #5更新依赖并打包,强制更新snapshots和releases
    #- mvn package -U
    #删除jar包,此步已在部署环节执行,个人也觉得在构建镜像后删除比较合适,当然也可以在这里打包前检查并删除
    #- rm -rf ${PROJECT_JAR_DIR}/app.jar
    #创建文件夹存储打包文件
    - mkdir -p ${PROJECT_JAR_DIR}
    #将打包文件复制到指定文件夹中,这里需要注意,打包后的jar包文件名称需要在项目的pom.xml中配置指定,不然默认生成的jar会是项目名-版本号.jar的格式
    - cp target/app.jar ${PROJECT_JAR_DIR}/app.jar
  #因为后续要用到这个任务打的包,后续配合dependencies在其他任务引用
  #artifacts:
    #paths:
      #- ${PROJECT_JAR_DIR}/*.jar


#任务部分,根据定义的stage顺序来执行任务
#构建镜像
job2-build:
  #任务阶段
  stage: build
  #任务引用的镜像
  image: docker:latest
  #任务执行选用的runner的标签,定义后会根据标签选用对应的runner执行任务
  tags:
    - runner-01
  #使用的docker服务,这里不是很清楚,但可以省略该部分,暂时不用它
  #services:
    #- 191.128.0.2:8443/test01/docker-hs:202401-dind
  #局部前置脚本命令,仅作用于此任务部分,创建用于存储项目镜像的本地路径,前面我们定义了全局变量,这里创建目录
  before_script:
    - mkdir -p ${CI_IMAGE_DIR}
  #执行脚本,列举jar包文件夹,构建镜像,打标签,推送镜像,删除镜像
  script:
    #提示信息打印
    - echo '打包任务开始---->清理之前的jar包,打包,将包复制到容器中'
    #列举当前jar包,查看是否已复制过来
    - ls -l ${PROJECT_JAR_DIR}
    #以下构建镜像部分会使用Dockerfile文件进行构建
    #.表示将镜像打标签后存放在当前位置,也可以存到别的位置,写成别的文件夹路径即可
    - docker build -t ${PROJECT_IMAGE_NAME}:${PROJECT_IMAGE_TAG} .
    #如果Dockerfile文件在别的目录下,如./src/Dockerfile,可以用-f指定文件位置
    #- docker build -t ${CI_IMAGE_DIR}:${PROJECT_IMAGE_TAG} -f ./src/Dockerfile .
    #将镜像推送到仓库
    - docker push ${PROJECT_IMAGE_NAME}:${PROJECT_IMAGE_TAG}
    #列举镜像是否已生成
    - docker images | ${PROJECT_IMAGE_NAME}
    #也是打标签,同上,但是可以将之前的名称改为新名称,此命令用于将镜像打标签后上传到harbor镜像仓库
    - docker -t  ${PROJECT_IMAGE_NAME}:${PROJECT_IMAGE_TAG} ${IMAGE_HARBOR_REPOSITORY}/${PROJECT_IMAGE_NAME}:${PROJECT_IMAGE_TAG}
    #将镜像推送到到harbor仓库
    - docker push ${IMAGE_HARBOR_REPOSITORY}/${PROJECT_IMAGE_NAME}:${PROJECT_IMAGE_TAG}
    #删除jar包
    - rm -rf ${PROJECT_JAR_DIR}/app.jar
    #删除打标签后用于推送到harbor仓库的的镜像
    - docker rmi -f ${IMAGE_HARBOR_REPOSITORY}/${PROJECT_IMAGE_NAME}:${PROJECT_IMAGE_TAG}
    #再删除原始构建的镜像
    - docker rmi -f ${CI_IMAGE_DIR}:${PROJECT_IMAGE_TAG}


#任务部分,根据定义的stage顺序来执行任务
#测试
#在任务前加英文点.来忽略任务,流程会跳过该任务的执行
.job3-test:
  #任务阶段
  stage: test
  #任务引用的镜像
  image: 191.128.0.2:8443/k8s-demo:$CI_COMMIT_REF_NAME
  #任务执行选用的runner的标签,定义后会根据标签选用对应的runner执行任务
  tags:
    - runner-01
  #指定此job只对master分支生效
  only:
    - master
  #执行脚本,部署服务
  script:
    - echo ${IMAGE_HARBOR_REPOSITORY}:$CI_COMMIT_REF_NAME
    - kubectl apply -f /etc/k8s-demo.yaml

#任务部分,根据定义的stage顺序来执行任务
#
job4-deploy:
  #任务阶段
  stage: deploy
  #任务引用的镜像,此处为项目部署所需要的项目镜像(前面build阶段构建的镜像),从harbor上拉取,速度很快
  image: ${IMAGE_HARBOR_REPOSITORY}/${PROJECT_IMAGE_NAME}:${PROJECT_IMAGE_TAG}
  #任务执行选用的runner的标签,定义后会根据标签选用对应的runner执行任务
  tags:
    - runner-01
  #指定此job只对master分支生效
  only:
    - master
  #执行脚本,部署服务
  script:
    - echo '项目部署--->开始部署,缓存部署,pod部署,服务部署'
    #部署java项目的yaml文件都放在/sb-p/sb-test文件夹下,需提前准备好
    - kubectl apply -f /sb-p/sb-test/sb-pvc.yaml
    - kubectl apply -f /sb-p/sb-test/sb-dplm.yaml
    - kubectl apply -f /sb-p/sb-test/sb-svc.yaml
  #配合artifacts参数使用,使用package阶段任务的打包环境
  #dependencies:
    #- package

感谢阅读,祝君暴富!

你可能感兴趣的:(#,Kubernetes,#,GitLab,#,Spring,Boot,gitlab,ci/cd,docker,容器,linux,java,运维)