准备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 buildtags 'latest'dockerfile file('Dockerfile')name "ncc0706/${bootJar.baseName}"files bootJar.archivePathbuildArgs(['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:8u131VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} /opt/application.jarCMD [ "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 :dockerBUILD 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: 1163BUILD 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 build2 files changed, 4 insertions(+)create mode 100644 Dockerfilecreate 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-dockerCreating ⬢ 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

heroku 部署 Spring Boot Docker Image相关推荐

  1. 使用 Docker 部署 Spring Boot

    使用 Docker 部署 Spring Boot Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下. ...

  2. Spring Boot 2 (四):使用 Docker 部署 Spring Boot

    Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下. 首先构建一个简单的 Spring Boot 项目, ...

  3. docker添加新的环境变量_Docker的安装及部署Spring Boot项目操作详解!

    本文使用Docker部署Spring Boot项目.部署之前需要环境中已经安装Docker和Maven(用于打包),所以本文先进行安装Docker和Maven:接着搭建一个Spring Boot项目, ...

  4. Spring Boot 2.0(四):使用 Docker 部署 Spring Boot

    Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下. 首先构建一个简单的 Spring Boot 项目, ...

  5. docker 打包镜像_Spring Boot2 系列教程(四十一)部署 Spring Boot 到远程 Docker 容器

    不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案. 不同于传 ...

  6. 一键部署 Spring Boot 到远程 Docker 容器

    首先构建一个简单的 Spring Boot 项目,然后给项目添加 Docker 支持,最后对项目进行部署. 文章目录 一.前提条件 1. SpringBoot项目 2. Docker插件 3. Doc ...

  7. springboot 微服务_使用 Docker 部署 Spring Boot微服务

    Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下. 首先构建一个简单的 Spring Boot 项目, ...

  8. (转)Spring Boot 2 (四):使用 Docker 部署 Spring Boot

    http://www.ityouknow.com/springboot/2018/03/19/spring-boot-docker.html Docker 技术发展为微服务落地提供了更加便利的环境,使 ...

  9. docker image设置jdk版本_Docker 部署 Spring Boot

    作者:云天 镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 一.Docker 简介 Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口.它是目前最流行的 Linux 容 ...

最新文章

  1. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
  2. android源码分析-深入MessageQueue
  3. hibernate----N-1(一)
  4. phpstrom查看代码总行数_歪特内推浦发银行总行信息科技部
  5. openssh升级之后git账户免密登陆失效
  6. 介绍Angular的注入服务
  7. 手把手教你从0开始建中台
  8. mergsort.c
  9. tomcat下载安装及配置教程
  10. 值得收藏的网盘搜索引擎网盘搜索工具
  11. 常见的网络协议和端口号
  12. SQLServer把日期/时间数据转换为指定格式之CONVERT()函数
  13. 餐巾计划问题【网络流24题】
  14. 计算机应用研究 增刊,计算机应用研究增刊是核心吗_计算机研究应用_计算机应用...
  15. Java基础eclipse版(二)——JDK、Eclipse的下载与安装
  16. 高中信息技术计算机网络教案,信息技术 - 第八册计算机教案(全册)-四年级...
  17. 戴尔R710服务器配置raid阵列(附图文)
  18. 3D音频再现理论研究(一)---3D音频技术历史介绍(转)
  19. Cozmo人工智能机器人SDK使用笔记(1)-基础部分basics
  20. MyCat是使用介绍

热门文章

  1. More Effective C++ Item 附2:一个auto_ptr的实现实例
  2. 彻底理解同步异步阻塞与非阻塞
  3. 跨越空间,GL的TP之术
  4. 自己编写字符串复制函数
  5. 点评国内各大在线app生成平台
  6. 三维重建工具001-——正确安装kaolin库并在SMR上运行
  7. 看不见的大猩猩:无处不在的6大错觉
  8. 算法 | A*算法实现最优路径规划
  9. Font Icon 的资源推荐
  10. 神策军丨我的转岗故事:舒适区的逃离与突破