1.测试jar有一个简单的接口

docker build windows 程序_docker


2.

spring-boot-maven-plugin开启分层构建

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
                <layers>
                    <enabled>true</enabled>
                </layers>
            </configuration>
        </plugin>
    </plugins>
 </build>

3.方式1

# 指定基础镜像,这是分阶段构建的前期阶段
FROM openjdk:8-jre-alpine as builder
# 执行工作目录
WORKDIR application
# 配置参数
ARG JAR_FILE=./*.jar
# 将编译构建得到的jar文件复制到镜像空间中
COPY ${JAR_FILE} application.jar
# 通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果
RUN java -Djarmode=layertools -jar application.jar extract

# 正式构建镜像
FROM openjdk:8-jre-alpine
WORKDIR application
# 前一阶段从jar中提取除了多个文件,这里分别执行COPY命令复制到镜像空间中,每次COPY都是一个layer
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT  ["java", "org.springframework.boot.loader.JarLauncher"]
# 分层构建传递参数写法
# ENTRYPOINT  ["sh","-c","java  $JAVA_OPTS org.springframework.boot.loader.JarLauncher $PARAMS"]
# 例如: docker run -d -p 21991:2199 --name demo3 -e JAVA_OPTS="-Xmx128m"  -e PARAMS="--spring.application.name=test-demo" docker-demo:1.3
#镜像放在最后,所传的java参数和覆盖配置文件参数写在docker镜像之前不然会导致传递失败
docker build -t docker-demo:1.0 .
docker run -d -p 2199:2199 --name demo1  docker-demo:1.0
docker exec -it demo1 sh

4.方式2

# 指定基础镜像,这是分阶段构建的前期阶段
FROM openjdk:8-jre-alpine
# 执行工作目录
WORKDIR application
# 配置参数
ARG JAR_FILE=./*.jar
# 将编译构建得到的jar文件复制到镜像空间中
COPY ${JAR_FILE} app.jar

ENTRYPOINT  ["sh","-c","java -jar $JAVA_OPTS app.jar"]

5.构建与进入容器

docker build -t docker-demo:1.2 .
docker run -d -p 21990:2199 --name demo2 -e JAVA_OPTS="-Xmx512m"  docker-demo:1.2
docker exec -it demo2 sh

注意:因为默认是以sh而不是bash所以docker exec -it demo2 /bin/bash会失败
关于ENTRYPOINT后的参数$0 $@解释,即本来容器启动时docker run commond 参数1 参数2,容器启动时只想传递参数而不传递命令commond则需要加$0 $@
ENTRYPOINT [“/bin/sh”, “-c”, “java $JAVA_OPTS -jar /app.jar $0 $@”]

6.容器命令上传比较简单,不贴图了,简单说下:打tag上传就行,具体可根据使用的docker仓库测试下。
注意:构建镜像时推荐使用分阶段构建,可使用docker history <容器id> 查看镜像分层信息,当java代码修改时,推送新的镜像,只会推送改动的层,测试方法也很简单,先推送一版本镜像至docker仓库,修改java代码再推送版本2镜像至镜像仓库,观察推送的层信息,变动的才会推送,这有利于镜像的推送和下载速度。

7.删除none镜像,多阶段构建时会产生中间镜像none,再此用命令进行删除

# 加 -f :强制删除;
docker rmi $(docker images | grep none | awk '{print $3}')

=20221029更新使用jenkins构建并推送==
示例Jenkinsfile

// 所有的脚本命令放在pipeline中
pipeline {
    // 指定任务在哪个集群节点中执行,any表示任意节点
    agent any

    // 声明全局变量,方便后面修改使用
    environment {
        GIT_ADDRESS = "https://gitee.com/lyr421/helloword.git"
        GIT_AUTH = 'bdd79df5-fce6-466a-9c23-637eeeabf588'
        MAVEN_HOME = "/usr/local/maven/bin"
        IMG_REPO = "registry.cn-guangzhou.aliyuncs.com"
        REPO_NAMESPACE = 'lyr-test'
    }

    stages {
        stage('拉取代码') {
            steps {
                // BRANCH为构建分支参数
				git branch: "${BRANCH}", credentialsId: "${GIT_AUTH}", url: "${GIT_ADDRESS}"
            }
        }
        stage('maven构建') {
            steps {
				sh "${MAVEN_HOME}/mvn clean package -U -Dmaven.test.skip=true"
            }
        }
        stage('生成镜像') {
            steps {
                // JOB_NAME为项目名变量(内置的环境变量) TAG为设置的变量标签
				sh '''
				docker build  -t ${IMG_REPO}/${REPO_NAMESPACE}/${JOB_NAME}:${TAG} .
                '''
            }
        }
        stage('推送镜像') {
            steps {
            withCredentials([usernamePassword(credentialsId: 'de2b7618-86b7-429d-b109-9cfe7a6d0b2d', passwordVariable: 'IMG_PWD', usernameVariable: 'IMG_USER')]) {
               	sh '''
               	echo "${IMG_PWD}" | docker login --username ${IMG_USER} --password-stdin ${IMG_REPO}
                docker image prune -f
                docker push ${IMG_REPO}/${REPO_NAMESPACE}/${JOB_NAME}:${TAG}
                '''
            }

            }
        }
         stage('清理') {
            steps {
               	sh '''
               	# 退出镜像仓库
                docker logout ${IMG_REPO}
                # 除删除镜像
                docker rmi ${IMG_REPO}/${REPO_NAMESPACE}/${JOB_NAME}:${TAG}
                # 发送镜像推送成功提醒
                echo  "发送镜像推送成功提醒"
                '''
            }
        }
    }
    // 通知内容
    post {
          success {
             //成功通知
             echo "成功通知"
          }
          failure {
             // 失败通知
             echo "失败通知"
          }
    }
}

dockr登录会有提示密码存储在:

cat .docker/config.json
# 输出存储的密码如下
{
        "auths": {
                "registry.cn-guangzhou.aliyuncs.com": {
                        "auth": "zZW46a2luluZ2ZzZW4xMDI2Z2Za2"
                }
        }

# 解密
echo 'zZW46a2luluZ2ZzZW4xMDI2Z2Za2' | base64 --decode

这种方式不安全,需要在登录成功后删除

docker logout ${IMG_REPO}