修改之前创建的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
随意创建一个目录,这里我用的 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