Spring Boot 可以在构建时,同时构建 Docker 镜像。本文先说结果,再说过程。
一、结论
前提条件:
- Spring Boot Web 应用,监听 8080 端口提供服务
- 以 Jar 形式发布
- 使用 Gradle 构建
1、创建工程并配置构建文件
创建工程,配置构建文件 build.gradle
,内容如下:
buildscript {
ext {
springBootVersion = '2.1.1.RELEASE'
}
repositories {
mavenCentral()
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath "gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.20.1"
}
}
plugins {
id "com.palantir.docker" version "0.20.1"
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: "com.palantir.docker"
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
implementation('org.springframework.boot:spring-boot-starter-web')
testImplementation('org.springframework.boot:spring-boot-starter-test')
}
docker {
name "${project.group}/${bootJar.baseName}"
copySpec.from(tasks.bootJar.outputs.files.singleFile).into("dependency")
dockerfile file('src/Docker/Dockerfile')
}
2、创建 Dockerfile
创建 src/Docker/Dockerfile
文件,内容如下:
FROM openjdk:8-jdk-alpine
COPY "dependency/*" "/app/app.jar"
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]
3、构建
先执行 build/bootJar
任务,然后执行 docker/docker
任务。
构建成功后,查看 Docker 镜像:
$ docker images
4、运行镜像
将宿主机的 9999 端口映射到容器的 8080 端口:
$ docker run -it -p 9999:8080 com.example/docker-demo
二、过程描述
1、编辑 Gradle 构建文件
编辑 build.gradle
的内容,引用插件,编写 Docker 构建任务。
以下内容为在原脚本上增加的内容:
buildscript {
repositories {
maven {
// 仓库位置
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
// 依赖
classpath "gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.20.1"
}
}
// 引用插件
plugins {
id "com.palantir.docker" version "0.20.1"
}
apply plugin: "com.palantir.docker"
// Docker 任务
docker {
// 镜像名称
name "${project.group}/${bootJar.baseName}"
// 将 bootJar 任务的输出内容,复制到 build/docker/dependency 下
// build/docker/ 为 Docker 工作目录
// 后续 Dockerfile 中复制文件时,都相对这个位置进行
copySpec.from(tasks.bootJar.outputs.files.singleFile).into("dependency")
// 指定 Dockerfile 的位置
dockerfile file('src/Docker/Dockerfile')
}
Gradle 的 Docker 插件是 com.palantir.docker,插件源码在 GitHub。这个插件是 Spring 官网 Demo 使用的插件。
类似的插件还有 gradle-docker-plugin,不过这个未经尝试。
2、Dockerfile
内容
创建 src/Docker/Dockerfile
文件,内容如下:
# 基础镜像
FROM openjdk:8-jdk-alpine
# 复制文件,源位置为相对 Docker 工作目录的位置,这个在 Gradle 脚本中指定
COPY "dependency/*" "/app/app.jar"
# 启动容器时运行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]
三、参考资料
(完)
网友评论