当前位置: 首页 > 工具软件 > Heroku-Docker > 使用案例 >

heroku 部署 Spring Boot Docker Image

郭凡
2023-12-01

准备Docker Image

修改之前创建的Spring Boot 项目, 添加 Docker 插件

build.gradle

plugins {
    id 'org.springframework.boot' version '2.2.2.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
    id 'com.palantir.docker' version '0.22.1'
}

group = 'io.arukas'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
targetCompatibility = '1.8'

bootJar {
    baseName = 'spring-boot-heroku-gradle'
    version = '0.0.1'
}

docker {
    dependsOn build
    tags 'latest'
    dockerfile file('Dockerfile')
    name "ncc0706/${bootJar.baseName}"
    files bootJar.archivePath
    buildArgs(['JAR_FILE': "${bootJar.archiveName}"])
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

test {
    useJUnitPlatform()
}

新增Dockerfile 文件

FROM ncc0706/jdk:8u131

VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} /opt/application.jar

CMD [ "sh", "-c", "java -Dserver.port=$PORT -Xmx300m -Xss512k -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom -jar /opt/application.jar" ]

构建本地镜像

➜  spring-boot-heroku-gradle-docker git:(master) gradle docker
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :compileJava
> Task :processResources
> Task :classes
> Task :bootJar
> Task :dockerfileZip
> Task :assemble
> Task :compileTestJava
> Task :processTestResources NO-SOURCE
> Task :testClasses

> Task :test
2019-12-27 21:58:05.695  INFO 1782 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

> Task :check
> Task :build
> Task :dockerClean UP-TO-DATE
> Task :dockerPrepare
> Task :docker

BUILD SUCCESSFUL in 26s
9 actionable tasks: 8 executed, 1 up-to-date

推送到 docker hub

➜  spring-boot-heroku-gradle-docker git:(master) gradle dockerPush
> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :bootJar UP-TO-DATE
> Task :dockerfileZip UP-TO-DATE
> Task :assemble UP-TO-DATE
> Task :compileTestJava UP-TO-DATE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test UP-TO-DATE
> Task :check UP-TO-DATE
> Task :build UP-TO-DATE
> Task :dockerClean
> Task :dockerPrepare
> Task :docker
> Task :dockerTagLatest
> Task :dockerTag

> Task :dockerPush
The push refers to repository [docker.io/ncc0706/spring-boot-heroku-gradle]
126d444a90fe: Preparing
7b1b25aff4b3: Preparing
75baf32179d0: Preparing
7bff100f35cb: Preparing
75baf32179d0: Mounted from ncc0706/heroku-me
126d444a90fe: Pushed
7b1b25aff4b3: Mounted from ncc0706/heroku-me
7bff100f35cb: Mounted from ncc0706/heroku-me
latest: digest: sha256:e4465a5bbd70b79c049e5f9c8e3a1afccb5f3a8019733cc70d4baa5b77c2cca8 size: 1163

BUILD SUCCESSFUL in 50s
11 actionable tasks: 5 executed, 6 up-to-date

查看构建好的镜像

➜  spring-boot-heroku-gradle-docker git:(master) docker images
REPOSITORY                                     TAG                 IMAGE ID            CREATED             SIZE
ncc0706/spring-boot-heroku-gradle              latest              a7c43414abf5        2 minutes ago       187MB

进入正题开始部署 Docker Image 到 heroku

随意创建一个目录,这里我用的 deploy, 创建2个文件如下

Dockerfile

这里的 Dockerfile 跟刚才创建的不一样哦,就是上面推送到 docker hub 的镜像名称

FROM ncc0706/spring-boot-heroku-gradle

heroku.yml

指定当前目录的 Dockerfile ,如果两个文件不在同一目录需指定相对路径

build:
  docker:
    web: Dockerfile

初始化仓库

进入 deploy 目录就是上面创建的

# 初始化仓库
$ git init

# 添加文件到本地暂存区
$ git add .

# 提交到本地仓库
$ git commit -am "ready build"
[master (root-commit) 3a1cf00] ready build
 2 files changed, 4 insertions(+)
 create mode 100644 Dockerfile
 create mode 100644 heroku.yml

创建应用

注意需要登录

$ heroku create spring-boot-heroku-gradle-docker
Creating ⬢ spring-boot-heroku-gradle-docker... !
 !    Name is too long (maximum is 30 characters)
 
 ## 上面提示名称太长了,再换个
 $ heroku create spring-boot-gradle-docker
 Creating ⬢ spring-boot-gradle-docker... done
https://spring-boot-gradle-docker.herokuapp.com/ | https://git.heroku.com/spring-boot-gradle-docker.git

开始构建

# 容器技术部署
$ heroku stack:set container
Stack set. Next release on ⬢ spring-boot-gradle-docker will use container.
Run git push heroku master to create a new release on ⬢ spring-boot-gradle-docker.
git push heroku master
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 323 bytes | 323.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: === Fetching app code
remote:
remote: === Building web (Dockerfile)
remote: Sending build context to Docker daemon  3.072kB
remote: Step 1/1 : FROM ncc0706/spring-boot-heroku-gradle
remote: latest: Pulling from ncc0706/spring-boot-heroku-gradle
remote: cd784148e348: Pulling fs layer
remote: 3651dac5ddfb: Pulling fs layer
remote: 1d73d5612a08: Pulling fs layer
remote: 21d15a920adf: Pulling fs layer
remote: 21d15a920adf: Waiting
remote: cd784148e348: Verifying Checksum
remote: cd784148e348: Download complete
remote: cd784148e348: Pull complete
remote: 21d15a920adf: Verifying Checksum
remote: 21d15a920adf: Download complete
remote: 3651dac5ddfb: Verifying Checksum
remote: 3651dac5ddfb: Download complete
remote: 3651dac5ddfb: Pull complete
remote: 1d73d5612a08: Verifying Checksum
remote: 1d73d5612a08: Download complete
remote: 1d73d5612a08: Pull complete
remote: 21d15a920adf: Pull complete
remote: Digest: sha256:e4465a5bbd70b79c049e5f9c8e3a1afccb5f3a8019733cc70d4baa5b77c2cca8
remote: Status: Downloaded newer image for ncc0706/spring-boot-heroku-gradle:latest
remote:  ---> a7c43414abf5
remote: Successfully built a7c43414abf5
remote: Successfully tagged b70bfb6b84da29431508650a9923a60aba64ac27:latest
remote:
remote: === Pushing web (Dockerfile)
remote: Tagged image "b70bfb6b84da29431508650a9923a60aba64ac27" as "registry.heroku.com/spring-boot-gradle-docker/web"
remote: The push refers to repository [registry.heroku.com/spring-boot-gradle-docker/web]
remote: 126d444a90fe: Preparing
remote: 7b1b25aff4b3: Preparing
remote: 75baf32179d0: Preparing
remote: 7bff100f35cb: Preparing
remote: 7bff100f35cb: Pushed
remote: 126d444a90fe: Pushed
remote: 75baf32179d0: Pushed
remote: 7b1b25aff4b3: Pushed
remote: latest: digest: sha256:e4465a5bbd70b79c049e5f9c8e3a1afccb5f3a8019733cc70d4baa5b77c2cca8 size: 1163
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/spring-boot-gradle-docker.git
 * [new branch]      master -> master

查看启动日志

$ heroku logs --tail
2019-12-27T14:17:40.177009+00:00 app[api]: Enable Logplex by user fdtomn@gmail.com
2019-12-27T14:17:40.177009+00:00 app[api]: Release v2 created by user fdtomn@gmail.com
2019-12-27T14:17:39.723167+00:00 app[api]: Initial release by user fdtomn@gmail.com
2019-12-27T14:17:39.723167+00:00 app[api]: Release v1 created by user fdtomn@gmail.com
2019-12-27T14:19:35.480563+00:00 app[api]: Release v3 created by user fdtomn@gmail.com
2019-12-27T14:19:35.480563+00:00 app[api]: Upgrade stack to container by user fdtomn@gmail.com
2019-12-27T14:19:35.467047+00:00 app[api]: Stack changed from heroku-18 to container by user fdtomn@gmail.com
2019-12-27T14:20:03.000000+00:00 app[api]: Build started by user fdtomn@gmail.com
2019-12-27T14:20:28.120580+00:00 app[api]: Release v4 created by user fdtomn@gmail.com
2019-12-27T14:20:28.120580+00:00 app[api]: Deploy 3a1cf002 by user fdtomn@gmail.com
2019-12-27T14:20:28.135935+00:00 app[api]: Scaled to web@1:Free by user fdtomn@gmail.com
2019-12-27T14:20:28.000000+00:00 app[api]: Build succeeded
2019-12-27T14:20:31.367067+00:00 heroku[web.1]: Starting process with command `sh -c java\ -Dserver.port\=\31283\ -Xmx300m\ -Xss512k\ -Dfile.encoding\=UTF-8\ -Djava.security.egd\=file:/dev/./urandom\ -jar\ /opt/application.jar`
2019-12-27T14:20:34.684410+00:00 app[web.1]:
2019-12-27T14:20:34.684615+00:00 app[web.1]: .   ____          _            __ _ _
2019-12-27T14:20:34.684753+00:00 app[web.1]: /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
2019-12-27T14:20:34.684891+00:00 app[web.1]: ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
2019-12-27T14:20:34.684977+00:00 app[web.1]: \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
2019-12-27T14:20:34.685113+00:00 app[web.1]: '  |____| .__|_| |_|_| |_\__, | / / / /
2019-12-27T14:20:34.685178+00:00 app[web.1]: =========|_|==============|___/=/_/_/_/
2019-12-27T14:20:34.686582+00:00 app[web.1]: :: Spring Boot ::        (v2.2.2.RELEASE)
2019-12-27T14:20:34.686634+00:00 app[web.1]:
2019-12-27T14:20:34.953867+00:00 app[web.1]: 2019-12-27 22:20:34.945  INFO 3 --- [           main] io.arukas.SpringBootHerokuApplication    : Starting SpringBootHerokuApplication on 626e4fdc-cb75-427b-a5b3-ebfce4331a1b with PID 3 (/opt/application.jar started by u27814 in /)
2019-12-27T14:20:34.959825+00:00 app[web.1]: 2019-12-27 22:20:34.959  INFO 3 --- [           main] io.arukas.SpringBootHerokuApplication    : No active profile set, falling back to default profiles: default
2019-12-27T14:20:37.154185+00:00 app[web.1]: 2019-12-27 22:20:37.153  INFO 3 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 31283 (http)
2019-12-27T14:20:37.169525+00:00 app[web.1]: 2019-12-27 22:20:37.169  INFO 3 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-12-27T14:20:37.169832+00:00 app[web.1]: 2019-12-27 22:20:37.169  INFO 3 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.29]
2019-12-27T14:20:37.255854+00:00 app[web.1]: 2019-12-27 22:20:37.255  INFO 3 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-12-27T14:20:37.255979+00:00 app[web.1]: 2019-12-27 22:20:37.255  INFO 3 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2050 ms
2019-12-27T14:20:37.559123+00:00 app[web.1]: 2019-12-27 22:20:37.558  INFO 3 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-12-27T14:20:37.869291+00:00 app[web.1]: 2019-12-27 22:20:37.869  INFO 3 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 31283 (http) with context path ''
2019-12-27T14:20:37.875301+00:00 app[web.1]: 2019-12-27 22:20:37.874  INFO 3 --- [           main] io.arukas.SpringBootHerokuApplication    : Started SpringBootHerokuApplication in 3.876 seconds (JVM running for 4.667)
2019-12-27T14:20:38.135299+00:00 heroku[web.1]: State changed from starting to up

从日志看我们已经用Dockerfile 成功部署 Spring Boot ,还是用浏览器看看效果吧,访问地址: https://spring-boot-gradle-docker.herokuapp.com.

项目源码: https://github.com/heroku-sample/spring-boot-heroku-gradle-docker.git

 类似资料: