hoomb
hoomb
خواندن ۳ دقیقه·۳ سال پیش

چگونه یک برنامه نوشته شده با Spring Boot را تبدیل به Docker کنیم



فریم ورک Spring Boot جای خودش رو در بین برنامه نویسان جاوا حسابی جا کرده و طوری محبوب شده که انگار قبل از اون برنامه نویسی جاوا معنی و مفهومی نداشته (که البته باور نکنید. خیلی فریم ورکهای خوبی بیرون آمده اند)

اولین مشکلی که احتمالا بعد از نوشتن برنامه و تست اون روی کامپیوتر شخصی خود به اون برخواهید خورد این هست که چطوری این برنامه رو به سرور انتقال بدید و در آنجا اجرا کنید.

صدالبته راحتترین راه این هستش که برنامه رو Build کنید و بعد از اون فایل JAR اصلی برنامه رو به سرور منتقل کرده و با این دستور اجرا کنید

$ java -jar target/my-test-application-1.0.0.jar

ولی خب از حق نگذریم از راحتی اجرای یک برنامه با Docker اصلا نمیشه گذشت.

برای اینکار دو راه داریم

راه اول: این دستور را که از SpringBoot 2.3 اضافه شده اجرا کنید

$ mvn spring-boot:build-image

و بعد با این دستور نام Image درست شده را چک کنید

$ docker image ls -a

و اینطوری آنرا اجرا کنید

$ docker run -it -p9099:8080 my-test-application:1.0.0

راه دوم: شخصا این روش را کاملا ترجیح میدهم و در تمام پروژه هام اون رو استفاده میکنم. با این روش کنترل کاملی بر روی Image ای که در نهایت درست میشود دارید و میتونید اون رو کاملا مطابق میل خود تغییر بدید. علاوه بر آن اگر دسترسی به Docker Repository ندارید، میتوانید Image درست شده را روی سرور کپی کنید و در آنجا اجرا کنید.

برای شروع فایل pom.xml را باز کنید و این پلاگین رو به اون اضافه کنید

<plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>2.8.0</version> <configuration> <from> <image>adoptopenjdk:11-jre-hotspot</image> </from> <to> <image>my-test-application:latest</image> </to> <container> <entrypoint> <shell>bash</shell> <option>-c</option> <arg>/entrypoint.sh</arg> </entrypoint> <ports> <port>8080</port> </ports> <environment> <SPRING_OUTPUT_ANSI_ENABLED>ALWAYS</SPRING_OUTPUT_ANSI_ENABLED> <MY_EXTRA_ENV>SomeValue</MY_EXTRA_ENV> </environment> <creationTime>USE_CURRENT_TIMESTAMP</creationTime> <user>1000</user> </container> <extraDirectories> <paths>src/main/docker/jib</paths> <permissions> <permission> <file>/entrypoint.sh</file> <mode>755</mode> </permission> </permissions> </extraDirectories> </configuration> </plugin>

همونطوری که میبینید به چند تا فایل احتیاج دارید. یکی از اونها entrypoint.sh هستش که در مسیر src/main/docker/jib ایجادش میکنید و این خطوط را بهش اضافه میکنید

#!/bin/sh exec java ${JAVA_OPTS} -noverify -XX:+AlwaysPreTouch -Djava.security.egd=file:/dev/./urandom -cp /app/resources/:/app/classes/:/app/libs/* &quotde.hoomb.testapp.MyTestApplication&quot &quot$@&quot

حالا کافیست با این دستور پروژه رو بسازید.

$ ./mvnw -ntp jib:buildTar

بعد از آن Image برنامه شما در مسیر target/jib-image.jar ایجاد میشود که میتوانید آنرا روی سرور خود کپی کنید.

در نهایت کافیست با این دستور آنرا روی سرور اجرا کنید

$ docker load --input jib-image.tar
$ docker run -it -p9099:8080 my-test-application

حتی میتوانید با استفاده از docker-compose راحتتر آن را اجرا کنید

version: '3.3' services: mytest-app: image: my-test-application environment: - _JAVA_OPTIONS=-Xmx4096m -Xms2048m -Duser.language=de-DE - SPRING_PROFILES_ACTIVE=prod,api-docs - LANGUAGE=de_DE:de - LC_ALL=de_DE.UTF-8 - LANG=de_DE.UTF-8 ports: - 127.0.0.1:9020:8080
dockerspringbootjava
شاید از این پست‌ها خوشتان بیاید