以下内容将重点介绍我在
Heroku云服务的免费虚拟机上运行dockerized Spring Boot应用程序的经验。 该提供程序的主要优点之一是,它可以创建不受操作时间限制的免费虚拟机,为此,仅注册就足够了。 即使确认付款细节,也无需确认,尽管您可以确认获得额外的奖金。 您可以
在此处详细了解其价格。 在我看来,他们关于免费资源的政策几乎没有类似之处。
因此,在Heroku上创建应用程序之后,有
几种方法可以在其中部署代码
- 在heroku git仓库中提交
- 将应用程序绑定到github仓库
- 使用码头集装箱
接下来,我们将考虑这些方法中的最后一种。 要继续,我们需要以下应用程序
这些工具中的最后一个将使我们有机会从命令行使用云进行所有操作。
我们首先通过
Spring Initializr创建一个Spring Boot应用程序。 作为依赖项,添加Spring Web Starter。 应该足够了。
在应用程序主类所在的同一包中,我们添加了REST控制器的最简单类,以便该应用程序以某种方式显示出生命迹象。
@RestController public class DemoController { @GetMapping("/check") public String check() { return "Application is alive"; } }
添加到
application.properties文件
server.port=${PORT:8080}
此设置对于在Heroku上运行容器至关重要。 事实是,在服务的内部网络中,应用程序在启动时在某个空闲端口上启动,该端口的数量通过PORT环境变量传输。 此外,应用程序必须在启动后的
60秒钟内有时间连接到该端口,否则它将停止。
在
pom.xml文件的
plugins部分中
,添加来自Spotify的
dockerfile-plugin ,这将帮助我们组装应用程序的
docker映像。
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.6</version> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <repository>registry.heroku.com/${project.artifactId}/web</repository> <tag>latest</tag> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin>
这样的插件配置将开始将映像构建为安装目标的一部分,并将映像作为部署目标的一部分推送到Heroku docker存储库中。 顺便说一句,为了能够运行maven deploy,您需要禁用收集的jar文件的部署(我们不需要将其上传到任何地方)。 您可以使用pom.xml文件的属性部分中的
maven.deploy.skip选项来执行此操作。
<properties> <java.version>1.8</java.version> <maven.deploy.skip>true</maven.deploy.skip> </properties>
接下来,在项目的根文件夹(在pom.xml旁)中创建一个
Dockerfile 。
FROM openjdk:8-jdk-alpine ARG JAR_FILE RUN mkdir -p /apps COPY ./target/${JAR_FILE} /apps/app.jar COPY ./entrypoint.sh /apps/entrypoint.sh RUN chmod +x /apps/entrypoint.sh CMD ["/apps/entrypoint.sh"]
如您所见,我们在这里将已组装的jar文件的名称作为参数传递给该程序集(ARG JAR_FILE)。 此参数的值在maven插件设置中设置。
entrypoint.sh脚本也将放置在项目的根目录中,并且非常简单。
请注意限制内存的JVM参数,尤其是前两个参数。 它们包括一种特殊的内存管理模式,当在Docker容器内启动Java应用程序时,这是必需的。 免费的Heroku机器上的应用程序可用内存限制为512MB。 超过此限制将终止应用程序。 如果要使用Java 9+,则需要将前两个选项替换为
-XX:+ UseContainerSupport 。 您可以
在这里阅读更多内容。 似乎容器支持已经不再是Java 8中的实验功能
。完成这些步骤后,尝试开始
mvnw clean install
如果一切都正确完成,则应构建应用程序及其相应的docker映像。 您可以检查图像是否使用以下命令创建
docker images
现在,让我们设置云并使用已经提到的Heroku CLI。 当然,要完成这些步骤,您将需要在Heroku上注册一个帐户。
首先,我们需要登录。 为此,运行命令
heroku login
并按照以下说明进行操作。
之后,您需要登录到heroku Docker存储库。 为此,运行命令
heroku container:login
没有这个,我们将无法推送docker映像。
接下来,我们使用以下命令创建应用程序
heroku apps:create <app-name>
请注意,应用程序名称必须与
pom.xml中指定的工件名称匹配。 也许在这里您将不得不花费一些时间来选择应用程序的名称,该名称仍未被任何人占用。
创建应用程序后,运行
mvnw clean deploy
并等待应用程序生成并推送docker映像。 请注意,仅当映像名称与
registry.heroku.com/<app-name>/web模板匹配并且创建了名称为<app-name>的应用程序时,才可以进行推送。 如果您查看maven插件设置,您会发现所有操作都完全一样。
部署和启动映像的最后一步是命令
heroku container:release web --app=<app-name>
之后,点击链接
https:// <app-name> .herokuapp.com / check ,一段时间后,您将看到控制器处理程序将显示的文本。
在浏览器中打开正在运行的应用程序的另一种方法是使用命令
heroku open --app=<app-name>
如果某些操作不起作用,则可以在Heroku Web界面或使用以下命令查看日志
heroku logs
仅此而已! 希望本指南对您有所帮助!
一些有用的链接
1. Heroku CLI
文档devcenter.heroku.com/categories/command-line2.关于dockerized Java
devcenter.heroku.com/articles/java-memory-issues中的内存管理功能
3.
devcenter.heroku.com/categories/deploying-with-docker4. Heroku的示例Java应用程序。 部署方法不同,但是查看
github.com/heroku/java-getting-started很有用
5. Heroku关于启动Java应用程序(不通过Docker)的
指南devcenter.heroku.com/articles/getting-started-with-java?singlepage=true6. Docker上有关使用Java的优秀材料
habr.com/en/company/hh/blog/4509547.关于在Docker容器中启动Java的选项
www.oracle.com/technetwork/java/javase/8u191-relnotes-5032181.html#JDK-8146115