Heroku + Docker + Spring Boot

سوف يركز التالي على تجربتي في تشغيل تطبيق Spring Boot المترسب على الأجهزة الظاهرية المجانية لخدمة السحابة Heroku . تتمثل إحدى المزايا الرئيسية لهذا المزود في أنه يتيح إمكانية إنشاء أجهزة افتراضية مجانية مع فرض قيود على ساعات العمل ، ولهذا فإن التسجيل فقط يكفي. لا يلزم تأكيد تفاصيل الدفع ، على الرغم من أنه إذا قمت بتأكيدها ، فيمكنك الحصول على مكافآت إضافية. يمكنك قراءة المزيد عن سعرها هنا . من وجهة نظري ، فإن سياستهم المتعلقة بالموارد المجانية لا تحتوي على نظائرها تقريبًا.

وهكذا ، بعد إنشاء تطبيق على Heroku ، هناك عدة طرق لنشر التعليمات البرمجية الخاصة بك فيه

  • ارتكاب في مستودع heroku بوابة
  • ربط التطبيق إلى مستودع جيثب
  • باستخدام حاوية عامل ميناء

بعد ذلك ، سننظر في آخر هذه الطرق. للمتابعة ، سنحتاج إلى التطبيقات التالية


ستتيح لنا آخر هذه الأدوات الفرصة لأداء جميع العمليات المتعلقة بالعمل مع السحابة من سطر الأوامر.

نبدأ بإنشاء تطبيق Spring Boot من خلال Spring Initializr . كما تبعيات إضافة 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 ، أضف dockerfile-plugin من Spotify ، مما سيساعدنا في تجميع صورة عامل الميناء في تطبيقنا.

 <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 كجزء من هدف النشر. بالمناسبة ، لكي تتمكن من تشغيل نشر maven ، تحتاج إلى تعطيل نشر ملف jar المُجمَّع (لا نحتاج إلى تحميله في أي مكان). يمكنك القيام بذلك باستخدام خيار maven.deploy.skip في قسم الخصائص في ملف pom.xml.

 <properties> <java.version>1.8</java.version> <maven.deploy.skip>true</maven.deploy.skip> </properties> 

بعد ذلك ، قم بإنشاء Dockerfile في المجلد الجذر للمشروع (بجانب pom.xml)

 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 في جذر المشروع وسيكون بسيطًا جدًا.

 #!/usr/bin/env sh /usr/bin/java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Xmx256m -Xss512k -XX:MetaspaceSize=100m -jar /apps/app.jar 

انتبه إلى معلمات JVM التي تحد الذاكرة ، وخاصة المعلمتين الأولين. وهي تشتمل على وضع خاص لإدارة الذاكرة ، وهو أمر ضروري عند تشغيل تطبيق java داخل حاوية Docker. تقتصر الذاكرة المتوفرة للتطبيق على أجهزة Heroku المجانية على 512 ميجابايت. سيؤدي تجاوز هذا الحد إلى إنهاء التطبيق. إذا كنت ترغب في استخدام Java 9+ ، فيجب استبدال الخيارين الأولين بواحد - XXX: + UseContainerSupport . يمكنك قراءة المزيد هنا . يبدو أيضًا أن دعم الحاوية لم يعد ميزة تجريبية في Java 8. التفاصيل هنا.

بعد الانتهاء من هذه الخطوات ، حاول البدء
 mvnw clean install 

إذا تم تنفيذ كل شيء بشكل صحيح ، فيجب بناء التطبيق وصورة عامل النقل. يمكنك التحقق من إنشاء الصورة باستخدام الأمر
 docker images 

الآن لنقم بإعداد السحابة واستخدام Heroku CLI الذي سبق ذكره لهذا الغرض. بالطبع ، لإكمال هذه الخطوات ، ستحتاج إلى تسجيل حساب على Heroku.

بادئ ذي بدء ، نحن بحاجة إلى تسجيل الدخول. للقيام بذلك ، قم بتشغيل الأمر
 heroku login 
واتبع التعليمات أدناه.

بعد ذلك ، تحتاج إلى تسجيل الدخول إلى مستودع heroku Docker. للقيام بذلك ، قم بتشغيل الأمر
 heroku container:login 
بدون هذا ، لا يمكننا دفع صورة عامل ميناء لدينا.

بعد ذلك ، نقوم بإنشاء التطبيق باستخدام الأمر
 heroku apps:create <app-name> 

يرجى ملاحظة أن اسم التطبيق يجب أن يتطابق مع اسم الأداة التي تم تحديدها في pom.xml . ربما سيتعين عليك هنا قضاء بعض الوقت في اختيار اسم التطبيق ، والذي لا يزال غير مشغول من قبل أي شخص.

بعد إنشاء التطبيق ، قم بتشغيل
 mvnw clean deploy 

وانتظر حتى يتم بناء التطبيق ودفع صورة عامل ميناء أن يحدث. يرجى ملاحظة أن الضغط لا يكون ممكنًا إلا إذا كان اسم الصورة يتطابق مع 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-line
2. حول ميزات إدارة الذاكرة في Java devcenter.heroku.com/articles/java-memory-issues
3. devcenter.heroku.com/categories/deploying-with- doocker
4. مثال تطبيق جافا من Heroku. هناك طريقة نشر مختلفة ، ولكن من المفيد إلقاء نظرة على github.com/heroku/java-getting-started
5. دليل Heroku لإطلاق تطبيق Java (وليس عبر Docker) devcenter.heroku.com/articles/getting-started-with-java؟singlepage=true
6. مادة جيدة عن استخدام جافا في Docker habr.com/en/company/hh/blog/450954
7. حول خيارات تشغيل Java في حاويات Docker www.oracle.com/technetwork/java/javase/8u191-relnotes-5032181.html#JDK-8146115

Source: https://habr.com/ru/post/ar459472/


All Articles