فریم ورک 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/* "de.hoomb.testapp.MyTestApplication" "$@"
حالا کافیست با این دستور پروژه رو بسازید.
$ ./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