{"id":161,"date":"2024-04-11T13:45:46","date_gmt":"2024-04-11T04:45:46","guid":{"rendered":"https:\/\/redutan.synology.me\/wordpress\/?p=161"},"modified":"2024-04-12T22:12:01","modified_gmt":"2024-04-12T13:12:01","slug":"jib-with-spring-boot-devtools","status":"publish","type":"post","link":"https:\/\/redutan.synology.me\/wordpress\/2024\/04\/11\/jib-with-spring-boot-devtools\/","title":{"rendered":"jib with spring-boot-devtools"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<h2>Problem<\/h2>\n\n\n\n<p>Production \ud658\uacbd \uc2a4\ucf00\uc904\ub9c1\ub41c \ubc30\uce58(k8s CronJob)\uac00 \uc2e4\ud328\ub418\ub294 \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p><br>\uc5ec\uae30\uc5d0 back-off \uc815\ucc45\uae4c\uc9c0 \ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc5b4\uc11c \uac19\uc740 \ubc30\uce58\uac00 \uc5ec\ub7ec\ubc88 \uc2e4\ud589\uae4c\uc9c0 \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<br>(k8s\uc5d0\uc11c <code>.spec.backOffLimit<\/code> \uac00 0 \uc774\uc0c1\uc774\uba74 \uc7ac\uc2dc\ub3c4\ud558\uac8c \ub429\ub2c8\ub2e4.)<\/p>\n\n\n\n<p>\uadf8\ub7f0\ub370 \uc911\uc694\ud55c \uac83\uc740 \uc774 \ubc30\uce58 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 \uc131\uacf5\ud588\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \uc131\uacf5\ud588\ub294\ub370 \uc65c exit \ucf54\ub4dc\uac00 0\uc774 \uc544\ub2cc \uac12\uc774 \ub098\uc654\ub294\uc9c0 \uc758\ubb38\uc774\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3>spring-boot application exit code<\/h3>\n\n\n\n<p>\uc544\ub798\ub294 \ubc30\uce58 \uad00\ub828 \ucf54\ub4dc \uc911 \uc77c\ubd80\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"public class BatchTemplate {\n    private final ApplicationContext applicationContext;\n\n    public void execute(Class&lt;?&gt; batchClass, Runnable batch) {\n        log.info(&quot;[BATCH] {} Start&quot;, batchClass.getSimpleName());\n        try {\n            batch.run();\n        } catch (Exception exception) {\n            log.warn(&quot;[BATCH] {} Failed&quot;, batchClass.getSimpleName(), exception);\n            throw exception;\n        }\n        log.info(&quot;[BATCH] {} Completed&quot;, batchClass.getSimpleName());\n\n        int exitCode = SpringApplication.exit(applicationContext, () -&gt; 0);\n        if (isFailed(exitCode)) {\n            log.error(&quot;[BATCH][AUDIT] {} Failed. exitCode: {}&quot;, batchClass.getSimpleName(), exitCode);\n        }\n    }\n\n    private boolean isFailed(int exitCode) {\n        return exitCode != 0;\n    }\n}\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #FF79C6\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">class<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">BatchTemplate<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">private<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">final<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">ApplicationContext<\/span><span style=\"color: #F8F8F2\"> applicationContext;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">void<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">execute<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #8BE9FD; font-style: italic\">Class<\/span><span style=\"color: #F8F8F2\">&lt;<\/span><span style=\"color: #8BE9FD; font-style: italic\">?<\/span><span style=\"color: #F8F8F2\">&gt; <\/span><span style=\"color: #FFB86C; font-style: italic\">batchClass<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #8BE9FD; font-style: italic\">Runnable<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">batch<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        log.<\/span><span style=\"color: #50FA7B\">info<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">[BATCH] {} Start<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, batchClass.<\/span><span style=\"color: #50FA7B\">getSimpleName<\/span><span style=\"color: #F8F8F2\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">try<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            batch.<\/span><span style=\"color: #50FA7B\">run<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        } <\/span><span style=\"color: #FF79C6\">catch<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #8BE9FD; font-style: italic\">Exception<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">exception<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            log.<\/span><span style=\"color: #50FA7B\">warn<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">[BATCH] {} Failed<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, batchClass.<\/span><span style=\"color: #50FA7B\">getSimpleName<\/span><span style=\"color: #F8F8F2\">(), exception);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #FF79C6\">throw<\/span><span style=\"color: #F8F8F2\"> exception;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        log.<\/span><span style=\"color: #50FA7B\">info<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">[BATCH] {} Completed<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, batchClass.<\/span><span style=\"color: #50FA7B\">getSimpleName<\/span><span style=\"color: #F8F8F2\">());<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #8BE9FD; font-style: italic\">int<\/span><span style=\"color: #F8F8F2\"> exitCode <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> SpringApplication.<\/span><span style=\"color: #50FA7B\">exit<\/span><span style=\"color: #F8F8F2\">(applicationContext, () <\/span><span style=\"color: #8BE9FD; font-style: italic\">-&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">0<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">if<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #50FA7B\">isFailed<\/span><span style=\"color: #F8F8F2\">(exitCode)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            log.<\/span><span style=\"color: #50FA7B\">error<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">[BATCH][AUDIT] {} Failed. exitCode: {}<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, batchClass.<\/span><span style=\"color: #50FA7B\">getSimpleName<\/span><span style=\"color: #F8F8F2\">(), exitCode);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">private<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">boolean<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">isFailed<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #8BE9FD; font-style: italic\">int<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">exitCode<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> exitCode <\/span><span style=\"color: #FF79C6\">!=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">0<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#efefe1;font-size:12px;line-height:1;position:relative\">Java<\/span><\/div>\n\n\n\n<p>\ubcf4\uc2dc\ub2e4\uc2dc\ud53c \ubc30\uce58\uc758 \uc2dc\uc791, \uc131\uacf5, \uc2e4\ud328\uc5d0 \ub300\ud574\uc11c \ub85c\uae45\uc744 \ud574 \ub454 \uc0c1\ud0dc\uc785\ub2c8\ub2e4.<br>\uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uac70\ub098 \ub0b4\ubd80\uc5d0 ExitCodeGenerator\uac00 0\uc774 \uc544\ub2cc \uac12\uc744 \ubc18\ud658\ud55c\ub2e4\uba74 exit \ucf54\ub4dc\uac00 0\uc774 \uc544\ub2c8\uac8c \ub418\uc5b4\uc11c \uc2e4\ud328\ub85c \ucc98\ub9ac\ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uad6c\ucd95\ud55c \ucf54\ub4dc\uc5d0\uc11c\ub294 \uba85\uc2dc\uc801\uc778 ExitCodeGenerator\uac00 \uc5c6\uc73c\ubbc0\ub85c \uc608\uc678\uac00 \ubc1c\uc0dd\ud588\ub2e4\ub294 \ub73b\uc778\ub370, \uc774 \uc608\uc678\ub97c \uac04\ub2e8\ud788 \ud655\uc778\ud558\uae30 \uc704\ud574\uc11c\ub294 <code>main()<\/code> \uba54\uc11c\ub4dc\uc5d0\uc11c \uba85\uc2dc\uc801\uc73c\ub85c \uc608\uc678\ub97c catch \ud574\ubcf4\uc558\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"@SpringBootApplication\n@Slf4j\npublic class SomeBootApplication {\n    public static void main(String[] args) {\n        try {\n            SpringApplication.run(SomeBootApplication.class, args);\n        } catch (Exception cause) {\n            log.error(&quot;Main Error&quot;, cause);\n            throw cause;\n        }\n    }\n}\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">@<\/span><span style=\"color: #8BE9FD; font-style: italic\">SpringBootApplication<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">@<\/span><span style=\"color: #8BE9FD; font-style: italic\">Slf4j<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">class<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">SomeBootApplication<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">static<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">void<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">main<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #8BE9FD; font-style: italic\">String<\/span><span style=\"color: #F8F8F2\">[] <\/span><span style=\"color: #FFB86C; font-style: italic\">args<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FF79C6\">try<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            SpringApplication.<\/span><span style=\"color: #50FA7B\">run<\/span><span style=\"color: #F8F8F2\">(SomeBootApplication.class, args);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        } <\/span><span style=\"color: #FF79C6\">catch<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #8BE9FD; font-style: italic\">Exception<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">cause<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            log.<\/span><span style=\"color: #50FA7B\">error<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">Main Error<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">, cause);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #FF79C6\">throw<\/span><span style=\"color: #F8F8F2\"> cause;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#efefe1;font-size:12px;line-height:1;position:relative\">Java<\/span><\/div>\n\n\n\n<p>\uc774\ub807\uac8c \ud574\uc11c \uc608\uc678\ub97c \ud655\uc778\ud574\ubcf4\ub2c8 \uc544\ub798\uc640 \uac19\uc774 <code>SilentExitExceptionHandler$SilentExitException<\/code> \ub77c\ub294 \uc608\uc678\uac00 \ud655\uc778\ub418\ub124\uc694.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"org.springframework.boot.devtools.restart.SilentExitExceptionHandler$SilentExitException: null\n\tat org.springframework.boot.devtools.restart.SilentExitExceptionHandler.exitCurrentThread(SilentExitExceptionHandler.java:92)\n\tat org.springframework.boot.devtools.restart.Restarter.immediateRestart(Restarter.java:179)\n\tat org.springframework.boot.devtools.restart.Restarter.initialize(Restarter.java:163)\n\tat org.springframework.boot.devtools.restart.Restarter.initialize(Restarter.java:539)\n\tat org.springframework.boot.devtools.restart.RestartApplicationListener.onApplicationStartingEvent(RestartApplicationListener.java:98)\n\tat org.springframework.boot.devtools.restart.RestartApplicationListener.onApplicationEvent(RestartApplicationListener.java:51)\n\tat org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:174)\n\tat org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)\n\tat org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:145)\n\tat org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:133)\n\tat org.springframework.boot.context.event.EventPublishingRunListener.multicastInitialEvent(EventPublishingRunListener.java:136)\n\tat org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:75)\n\tat org.springframework.boot.SpringApplicationRunListeners.lambda$starting$0(SpringApplicationRunListeners.java:54)\n\tat java.base\/java.lang.Iterable.forEach(Iterable.java:75)\n\tat org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118)\n\tat org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:54)\n\tat org.springframework.boot.SpringApplication.run(SpringApplication.java:316)\n\tat org.springframework.boot.SpringApplication.run(SpringApplication.java:1317)\n\tat org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)\n\tat com.example.SomeApplication.main(SomeApplication.java:32)\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">org.springframework.boot.devtools.restart.SilentExitExceptionHandler$SilentExitException<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.boot.devtools.restart.SilentExitExceptionHandler.<\/span><span style=\"color: #50FA7B\">exitCurrentThread<\/span><span style=\"color: #F8F8F2\">(SilentExitExceptionHandler.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">92<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.boot.devtools.restart.Restarter.<\/span><span style=\"color: #50FA7B\">immediateRestart<\/span><span style=\"color: #F8F8F2\">(Restarter.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">179<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.boot.devtools.restart.Restarter.<\/span><span style=\"color: #50FA7B\">initialize<\/span><span style=\"color: #F8F8F2\">(Restarter.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">163<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.boot.devtools.restart.Restarter.<\/span><span style=\"color: #50FA7B\">initialize<\/span><span style=\"color: #F8F8F2\">(Restarter.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">539<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.boot.devtools.restart.RestartApplicationListener.<\/span><span style=\"color: #50FA7B\">onApplicationStartingEvent<\/span><span style=\"color: #F8F8F2\">(RestartApplicationListener.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">98<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.boot.devtools.restart.RestartApplicationListener.<\/span><span style=\"color: #50FA7B\">onApplicationEvent<\/span><span style=\"color: #F8F8F2\">(RestartApplicationListener.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">51<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.context.event.SimpleApplicationEventMulticaster.<\/span><span style=\"color: #50FA7B\">doInvokeListener<\/span><span style=\"color: #F8F8F2\">(SimpleApplicationEventMulticaster.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">174<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.context.event.SimpleApplicationEventMulticaster.<\/span><span style=\"color: #50FA7B\">invokeListener<\/span><span style=\"color: #F8F8F2\">(SimpleApplicationEventMulticaster.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">167<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.context.event.SimpleApplicationEventMulticaster.<\/span><span style=\"color: #50FA7B\">multicastEvent<\/span><span style=\"color: #F8F8F2\">(SimpleApplicationEventMulticaster.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">145<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.context.event.SimpleApplicationEventMulticaster.<\/span><span style=\"color: #50FA7B\">multicastEvent<\/span><span style=\"color: #F8F8F2\">(SimpleApplicationEventMulticaster.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">133<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.boot.context.event.EventPublishingRunListener.<\/span><span style=\"color: #50FA7B\">multicastInitialEvent<\/span><span style=\"color: #F8F8F2\">(EventPublishingRunListener.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">136<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.boot.context.event.EventPublishingRunListener.<\/span><span style=\"color: #50FA7B\">starting<\/span><span style=\"color: #F8F8F2\">(EventPublishingRunListener.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">75<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.boot.SpringApplicationRunListeners.<\/span><span style=\"color: #50FA7B\">lambda$starting$0<\/span><span style=\"color: #F8F8F2\">(SpringApplicationRunListeners.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">54<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat java.base<\/span><span style=\"color: #FF79C6\">\/<\/span><span style=\"color: #F8F8F2\">java.lang.Iterable.<\/span><span style=\"color: #50FA7B\">forEach<\/span><span style=\"color: #F8F8F2\">(Iterable.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">75<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.boot.SpringApplicationRunListeners.<\/span><span style=\"color: #50FA7B\">doWithListeners<\/span><span style=\"color: #F8F8F2\">(SpringApplicationRunListeners.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">118<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.boot.SpringApplicationRunListeners.<\/span><span style=\"color: #50FA7B\">starting<\/span><span style=\"color: #F8F8F2\">(SpringApplicationRunListeners.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">54<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.boot.SpringApplication.<\/span><span style=\"color: #50FA7B\">run<\/span><span style=\"color: #F8F8F2\">(SpringApplication.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">316<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.boot.SpringApplication.<\/span><span style=\"color: #50FA7B\">run<\/span><span style=\"color: #F8F8F2\">(SpringApplication.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">1317<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat org.springframework.boot.SpringApplication.<\/span><span style=\"color: #50FA7B\">run<\/span><span style=\"color: #F8F8F2\">(SpringApplication.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">1306<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">\tat com.example.SomeApplication.<\/span><span style=\"color: #50FA7B\">main<\/span><span style=\"color: #F8F8F2\">(SomeApplication.java<\/span><span style=\"color: #FF79C6\">:<\/span><span style=\"color: #BD93F9\">32<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#efefe1;font-size:12px;line-height:1;position:relative\">Java<\/span><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h3>spring-boot-devtools<\/h3>\n\n\n\n<p>\ud574\ub2f9 \uc608\uc678\ub294 spring-boot-devtools\uc774 \ud65c\uc131\ud654 \ub41c \uc0c1\ud0dc\uc5d0\uc11c auto-restart \uae30\ub2a5 \ub54c\ubb38\uc5d0 \uc874\uc7ac\ud558\ub294\ub370, \uc65c production \ud658\uacbd\uc5d0\uc11c  spring-boot-devtools \uac00 \ud65c\uc131\ud654\ub418\uc5c8\ub294\uc9c0 \uc758\ubb38\uc774\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>spring-boot-devtools \uac00 \ud65c\uc131\ud654 \ub418\ub824\uba74 \uc870\uac74\uc774 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<ul>\n<li>\ud328\ud0a4\uc9c0\ud654\ub41c \uacbd\uc6b0\uc5d0\ub294 \uae30\ubcf8\uc73c\ub85c \ube44\ud65c\uc131\ud654. <br><code>java -jar som-application.jar<\/code> \ucc98\ub7fc <code>-jar<\/code> \uc635\uc158\uc73c\ub85c \uc2e4\ud589\ud558\ub294 \uacbd\uc6b0<br><code>developmentOnly(\"org.springframework.boot:spring-boot-devtools\")<\/code>\ub85c \uc758\uc874\uc131 \ucd94\uac00\ud588\uae30 \ub54c\ubb38<\/li>\n\n\n\n<li>\ud2b9\uc218\ud55c ClassLoader\ub85c \uc2dc\uc791\ud558\ub294 \uacbd\uc6b0.<\/li>\n<\/ul>\n\n\n\n<p>\uadf8\ub798\uc11c local\uc5d0\uc11c \uc774\uac83\uc800\uac83 \ud655\uc778\ud558\uba74\uc11c \ud14c\uc2a4\ud2b8 \ud574\ubd24\ub294\ub370, \ubb38\uc81c\ub97c \ubc1c\uacac\ud560 \uc218 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<ul>\n<li>local \ucef4\ud4e8\ud130\uc5d0\uc11c IDE\ub85c \uae30\ub3d9\ud558\uba74 devtools \uac00 \ud65c\uc131\ud654. <code>-<\/code>cp \uc635\uc158 \uc2e4\ud589<\/li>\n\n\n\n<li><code>java -jar someApplication.jar<\/code> \uba85\ub839\uc5b4\ub85c \uc2e4\ud589\ud558\uba74 devtools\uac00 \ube44\ud65c\uc131\ud654<\/li>\n<\/ul>\n\n\n\n<p>\uadf8\ub7fc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 \ubb38\uc81c \uc5c6\ub2e4\uace0 \ubcf4\uace0 \uc778\ud504\ub77c \ub808\ubca8\uc5d0\uc11c \ud655\uc778\ud574\ubcf4\uae30\ub85c \ud588\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3>k8s CronJob<\/h3>\n\n\n\n<p>\ucef4\ud4e8\ud305 \uc2dc AWS EKS\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uace0, \uadf8 \uc911 \uc2a4\ucf00\uc904\ub9c1\ub418\ub294 \ubc30\uce58\ub294 k8s CronJob\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 CronJob(or Job) \uc124\uc815\uc5d0 \ubb38\uc81c\uac00 \uc788\ub2e4\uace0 \ud310\ub2e8\uc744 \ud588\uc2b5\ub2c8\ub2e4.<br>\uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 \uc815\uc0c1\uc801\uc73c\ub85c \uc885\ub8cc\ud558\uc9c0\ub9cc CronJob \uc5d0\uc11c \uc5b4\ub5a4 \uc81c\uc57d\uc73c\ub85c \uc778\ud574 \uc815\uc0c1 \uc885\ub8cc \ub418\uc9c0 \uc54a\uc558\ub2e4\uace0 \ubd24\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uad6c\uc131\uc744 \ud655\uc778\ud574\ubcf4\ub2c8 \uc758\uc2ec\uac00\ub294 \ubd80\ubd84\uc774 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. <\/p>\n\n\n\n<ol>\n<li><code>activeDeadlineSeconds<\/code>: Job\uc774 \uae30\ub3d9\ub418\ub294 \ucd5c\ub300 \uc2dc\uac04<\/li>\n\n\n\n<li><code>terminationGracePeriodSeconds<\/code>: \uc167\ub2e4\uc6b4 \ub300\uae30 \uc720\uc608 \uc2dc\uac04<\/li>\n<\/ol>\n\n\n\n<p>2\uac1c\uc758 \uac12\uc774 \ub108\ubb34 \uc791\uac8c \uc124\uc815\ub418\uc5b4 \uc788\uc5b4\uc11c \ub109\ub109\ud558\uac8c \ub298\ub824\ub480\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<ol>\n<li><code>activeDeadlineSeconds: 600<\/code><\/li>\n\n\n\n<li><code>terminationGracePeriodSeconds: 100<\/code><\/li>\n<\/ol>\n\n\n\n<p>\uadf8\ub798\ub3c4 \ubb38\uc81c\ub294 \ud574\uacb0\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.(\uc9c0\uba74 \uc0c1\uc73c\ub85c\ub294 \uac04\ub2e8\ud558\uac8c \uc801\uc5b4\ub450\uc5c8\uc9c0\ub9cc \uc2e4\uc81c\ub85c\ub294 \uc5ec\ub7ec\uac00\uc9c0 \uc885\ub958\uc758 \uc2e4\ud5d8\uc744 \ub9ce\uc774 \ud588\uc2b5\ub2c8\ub2e4.)<\/p>\n\n\n\n<p>\uacb0\uad6d Java \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ud504\ub85c\uc138\uc2a4\uac00 \uc5b4\ub5bb\uac8c \uc2e4\ud589\ub418\ub294\uc9c0 \uc54c\uae30 \uc704\ud574\uc11c Pod\ub0b4 Shell\ub85c \uc9c1\uc811 \uc811\uc18d\ud574\uc11c \uc5ec\ub7ec\uac00\uc9c0 \ud655\uc778\ud574\ubcf4\uc558\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2>Into the pod<\/h2>\n\n\n\n<p>\uac1c\ubc1c \ud658\uacbd\uc5d0\uc11c \ud574\ub2f9 pod\uc5d0 \uc811\uc18d\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"bash-5.2# jps -v\n1 SomeApplication -Xms512m -Xmx512m -javaagent:\/newrelic\/newrelic.jar\n33549 Jps -Dapplication.home=\/usr\/lib\/jvm\/java-21-amazon-corretto.x86_64 -Xms8m -Djdk.module.main=jdk.jcmd\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">bash-5.2#<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">jps<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-v<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">1<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">SomeApplication<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-Xms512m<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-Xmx512m<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-javaagent:\/newrelic\/newrelic.jar<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">33549<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">Jps<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-Dapplication.home=\/usr\/lib\/jvm\/java-21-amazon-corretto.x86_64<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-Xms8m<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-Djdk.module.main=jdk.jcmd<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#efefe1;font-size:12px;line-height:1;position:relative\">Bash<\/span><\/div>\n\n\n\n<p><code>jps<\/code> \uba85\ub839\uc5b4\ub85c \ud574\ub2f9 \ud504\ub85c\uc138\uc2a4\uac00 \ud655\uc778\ub429\ub2c8\ub2e4. <code>ps<\/code> \uba85\ub839\uc5b4\ub85c\ub3c4 \ud655\uc778\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"bash-5.2# ps -ef | grep SomeApplication\nroot           1       0  3 01:48 ?        00:05:10 java -Xms512m -Xmx512m -javaagent:\/newrelic\/newrelic.jar -cp @\/app\/jib-classpath-file com.example.SomeApplication\nroot       34103   33321  0 04:00 pts\/0    00:00:00 grep SomeApplication\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">bash-5.2#<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">ps<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-ef<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">|<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">grep<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">SomeApplication<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">root<\/span><span style=\"color: #F8F8F2\">           <\/span><span style=\"color: #BD93F9\">1<\/span><span style=\"color: #F8F8F2\">       <\/span><span style=\"color: #BD93F9\">0<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #BD93F9\">3<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">01<\/span><span style=\"color: #F1FA8C\">:48<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">?<\/span><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #BD93F9\">00<\/span><span style=\"color: #F1FA8C\">:05:10<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">java<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-Xms512m<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-Xmx512m<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-javaagent:\/newrelic\/newrelic.jar<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-cp<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">@\/app\/jib-classpath-file<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">com.example.SomeApplication<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">root<\/span><span style=\"color: #F8F8F2\">       <\/span><span style=\"color: #BD93F9\">34103<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #BD93F9\">33321<\/span><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #BD93F9\">0<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">04<\/span><span style=\"color: #F1FA8C\">:00<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">pts\/0<\/span><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #BD93F9\">00<\/span><span style=\"color: #F1FA8C\">:00:00<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">grep<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">SomeApplication<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#efefe1;font-size:12px;line-height:1;position:relative\">Bash<\/span><\/div>\n\n\n\n<p>\uc800\ub294 \uc774\uac83\uc744 \ubcf4\uace0 \ub208\uc744 \uc758\uc2ec\ud588\uc2b5\ub2c8\ub2e4. <code>-cp<\/code>(classpath) \uc635\uc158\uc73c\ub85c \uc2e4\ud589\ub418\uace0 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. \ud83d\ude2c<br><code>-cp<\/code> \uc635\uc158\uc740 <code>-jar<\/code> \uc635\uc158\uacfc \ub2e4\ub974\uac8c \ud328\ud0a4\uc9d5\ub41c jar\ub97c \uae30\ubc18\uc73c\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc2e4\ud589\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \ud2b9\uc815 classpath\ub97c \uae30\ubc18\uc73c\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4. <\/p>\n\n\n\n<p><code>app\/jib-classpath-file<\/code> \ub3c4 \ubc14\ub85c \ud655\uc778\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/app\/resources:\/app\/classes:\/app\/libs\/spring-boot-devtools-3.1.10.jar:\/app\/libs\/spring-boot-starter-actuator-3.1.10.jar:\/app\/libs\/spring-boot-starter-cache-3.1.10.jar:\/app\/libs\/spring-boot-starter-data-jpa-3.1.10.jar:\/app\/libs\/spring-boot-starter-data-redis-3.1.10.jar:...\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">\/app\/resources:\/app\/classes:\/app\/libs\/spring-boot-devtools-3.1.10.jar:\/app\/libs\/spring-boot-starter-actuator-3.1.10.jar:\/app\/libs\/spring-boot-starter-cache-3.1.10.jar:\/app\/libs\/spring-boot-starter-data-jpa-3.1.10.jar:\/app\/libs\/spring-boot-starter-data-redis-3.1.10.jar:...<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#efefe1;font-size:12px;line-height:1;position:relative\">Bash<\/span><\/div>\n\n\n\n<p>\uc774\ub807\uac8c \ud2b9\uc815 \ud3f4\ub354\ub4e4\uacfc \uc5c4\uccad\ub09c \uc218\uc758 jar \ud30c\uc77c\ub4e4\uc774 \uc120\uc5b8\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>-cp \uc635\uc158\uc740 \ud2b9\uc815 \uacbd\ub85c\uc758 \ud074\ub798\uc2a4 \ud30c\uc77c\uacfc \ub9ac\uc18c\uc2a4 \uadf8\ub9ac\uace0 jar\ub4e4\ub85c JVM \uae30\ubc18 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uae30\ub3d9\ud558\ub294 \uc635\uc158\uc785\ub2c8\ub2e4.<br>\uc704\uc5d0\uc11c \uae30\uc5b5\ud558\uc2e4\uc9c0 \ubaa8\ub974\uaca0\uc9c0\ub9cc <code>-jar<\/code> \uac00 \uc544\ub2cc <code>-cp<\/code> \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uac8c \ub418\uba74 <code>spring-boot-devtools<\/code> \uac00 \ud65c\uc131\ud654 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\ub4dc\ub514\uc5b4 \ubb38\uc81c \ud574\uacb0\uc758 \uc2e4\ub9c8\ub9ac\ub97c \ucc3e\uc558\uc2b5\ub2c8\ub2e4!<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p><strong>Checkpoint<\/strong><\/p>\n<cite><code>java -cp<\/code> \ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uae30\ub3d9\ub418\uc5b4\uc11c <code>spring-boot-devtools<\/code>\uac00 \ud65c\uc131\ud654.<\/cite><\/blockquote>\n\n\n\n<p>\ud604\uc7ac Container \ub0b4\uc5d0\uc11c \ub514\ub809\ud1a0\ub9ac \uad6c\uc870\ub97c \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"bash-5.2# cd \/app\nbash-5.2# tree -d -L 2\n.\n\u251c\u2500\u2500 classes\n\u2502   \u251c\u2500\u2500 META-INF\n\u2502   \u2514\u2500\u2500 com\n\u251c\u2500\u2500 libs\n\u2514\u2500\u2500 resources\n    \u251c\u2500\u2500 config\n    \u251c\u2500\u2500 db\n    \u251c\u2500\u2500 font\n    \u251c\u2500\u2500 message\n    \u2514\u2500\u2500 templates\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">bash-5.2#<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">cd<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\/app<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">bash-5.2#<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">tree<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-d<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-L<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #8BE9FD\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">\u251c\u2500\u2500<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">classes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">\u2502<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #F1FA8C\">\u251c\u2500\u2500<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">META-INF<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">\u2502<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #F1FA8C\">\u2514\u2500\u2500<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">com<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">\u251c\u2500\u2500<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">libs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">\u2514\u2500\u2500<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">resources<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">\u251c\u2500\u2500<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">config<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">\u251c\u2500\u2500<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">db<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">\u251c\u2500\u2500<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">font<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">\u251c\u2500\u2500<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">\u2514\u2500\u2500<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">templates<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#efefe1;font-size:12px;line-height:1;position:relative\">Bash<\/span><\/div>\n\n\n\n<p>\uc6d0\ub798 spring boot \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ud328\ud0a4\uc9d5\ud558\uba74 \ud558\ub098\uc758 jar \ub9cc \ub098\uc624\ub294\ub370, \uc5ec\uae30\ub294 \ud2b9\uc774\ud558\uac8c \uc704\uc640 \uac19\uc740 \ub514\ub809\ud1a0\ub9ac \uad6c\uc870\ub124\uc694. \uc790\uc138\ud788 \ud655\uc778\ud574\ubcf4\ub2c8<\/p>\n\n\n\n<ul>\n<li>classes: \ucf54\ub4dc\uc758 classes<\/li>\n\n\n\n<li>libs: \uc758\uc874\ud558\ub294 jar\ub4e4<\/li>\n\n\n\n<li>resources: classe \uc678 \uc815\uc801 \ud30c\uc77c\ub4e4<\/li>\n<\/ul>\n\n\n\n<p>\uc774\ub7ec\uba74 Containerization \ub2f4\ub2f9\ud558\ub294 Jib\ub97c \ud655\uc778\ud574\ubd10\uc57c\uaca0\ub124\uc694.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3>Jib<\/h3>\n\n\n\n<p>Jib\uc740 \uc790\ubc14\ub85c \ub41c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ucee8\ud14c\uc774\ub108 \uc774\ubbf8\uc9c0\ub85c \ud328\ud0a4\uc9d5(Containerization) \ub3c4\uad6c\uc785\ub2c8\ub2e4.<br>Gradle\ub098 Maven\uacfc \uac19\uc740 \uc790\ubc14\uc758 \uc778\uae30\uc788\ub294 \ube4c\ub4dc \ub3c4\uad6c\uc5d0 \uc798 \ud1b5\ud569\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h4>Jib \ucc38\uace0 \uc790\ub8cc<\/h4>\n\n\n\n<ul>\n<li><a href=\"https:\/\/cloudplatform.googleblog.com\/2018\/07\/introducing-jib-build-java-docker-images-better.html\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/cloudplatform.googleblog.com\/2018\/07\/introducing-jib-build-java-docker-images-better.html<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/speakerdeck.com\/coollog\/build-containers-faster-with-jib-a-google-image-build-tool-for-java-applications?slide=61\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/speakerdeck.com\/coollog\/build-containers-faster-with-jib-a-google-image-build-tool-for-java-applications?slide=61<br><\/a><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"567\" src=\"https:\/\/redutan.synology.me\/wordpress\/wp-content\/uploads\/2024\/04\/image-1-1024x567.png\" alt=\"\" class=\"wp-image-179\" srcset=\"https:\/\/redutan.synology.me\/wordpress\/wp-content\/uploads\/2024\/04\/image-1-1024x567.png 1024w, https:\/\/redutan.synology.me\/wordpress\/wp-content\/uploads\/2024\/04\/image-1-300x166.png 300w, https:\/\/redutan.synology.me\/wordpress\/wp-content\/uploads\/2024\/04\/image-1-768x425.png 768w, https:\/\/redutan.synology.me\/wordpress\/wp-content\/uploads\/2024\/04\/image-1.png 1326w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">\ucd9c\ucc98: <a href=\"https:\/\/cloudplatform.googleblog.com\/2018\/07\/introducing-jib-build-java-docker-images-better.html\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/cloudplatform.googleblog.com\/2018\/07\/introducing-jib-build-java-docker-images-better.html<\/a><\/figcaption><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Gradle(kts)\uc5d0\uc11c\ub294 \uc544\ub798\uc640 \uac19\uc740 \uc120\uc5b8\uc73c\ub85c \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"jib {\n    from {\n        image = &quot;amazoncorretto:21-al2023-jdk&quot;\n    }\n    to {\n        image = System.getenv(&quot;ECR_REGISTRY&quot;) + &quot;\/&quot; + System.getenv(&quot;ECR_REPOSITORY&quot;)\n        tags = setOf(System.getenv(&quot;IMAGE_TAG&quot;) ?: &quot;default_tag&quot;)\n    }\n    container {\n        jvmFlags = listOf(\n                System.getenv(&quot;JVM_XMS&quot;) ?: &quot;-Xms512m&quot;,\n                System.getenv(&quot;JVM_XMX&quot;) ?: &quot;-Xmx512m&quot;,\n                &quot;-javaagent:\/newrelic\/newrelic.jar&quot;\n        )\n    }\n}\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">jib<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">from<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #50FA7B\">image<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">amazoncorretto:21-al2023-jdk<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">to<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #50FA7B\">image<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">System.getenv<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #50FA7B\">&quot;ECR_REGISTRY&quot;<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #F1FA8C\">+<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">\/<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">+<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">System.getenv<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #50FA7B\">&quot;ECR_REPOSITORY&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #50FA7B\">tags<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">setOf<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #50FA7B\">System.getenv(<\/span><span style=\"color: #50FA7B\">&quot;IMAGE_TAG&quot;<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #F1FA8C\">?:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">default_tag<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">container<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #50FA7B\">jvmFlags<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">listOf<\/span><span style=\"color: #F8F8F2\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #50FA7B\">System.getenv(<\/span><span style=\"color: #50FA7B\">&quot;JVM_XMS&quot;<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #F1FA8C\">?:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">-Xms512m<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #50FA7B\">System.getenv(<\/span><span style=\"color: #50FA7B\">&quot;JVM_XMX&quot;<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #FF79C6\">?<\/span><span style=\"color: #F8F8F2\">: <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">-Xmx512m<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #50FA7B\">&quot;-javaagent:\/newrelic\/newrelic.jar&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#efefe1;font-size:12px;line-height:1;position:relative\">Bash<\/span><\/div>\n\n\n\n<ul>\n<li><code>from<\/code>: base \uc774\ubbf8\uc9c0 \uc124\uc815. \uc5ec\uae30\uc5d0\uc11c\ub294 \uc544\ub9c8\uc874 Corretto 21 JDK\ub97c \uc544\ub9c8\uc874 \ub9ac\ub205\uc2a4 2023 OS\ub85c \uc124\uc815\ud568<\/li>\n\n\n\n<li><code>to<\/code>: \uc774\ubbf8\uc9c0 Registry\uc640 \uacbd\ub85c, \ud0dc\uadf8 \uc815\ubcf4\ub97c \uc124\uc815. \uc5ec\uae30\uc5d0\uc11c\ub294 \ud658\uacbd\ubcc0\uc218\ud654 \ub41c \uc544\ub9c8\uc874 ECR\ub85c \uc124\uc815<\/li>\n\n\n\n<li><code>container<\/code>: \ucee8\ud14c\uc774\ub108 \ub0b4 \uc124\uc815. \uc5ec\uae30\uc5d0\uc11c\ub294 jvm \uc635\uc158 \uc124\uc815. \uc774 \uc678\uc5d0 \ucee8\ud14c\uc774\ub108 \ub0b4 \ud658\uacbd \ubcc0\uc218 \uc124\uc815\ub3c4 \uac00\ub2a5\ud568.<\/li>\n<\/ul>\n\n\n\n<p>\uc704 \uc124\uc815\ub9cc\uc73c\ub85c\ub294 jar \ud328\ud0a4\uc9d5\ub418\uc9c0 \uc54a\uc558\ub294\uc9c0 \uc54c \uc218\uac00 \uc5c6\uad70\uc694.<br>\uc880 \ub354 \uc790\uc138\ud558\uac8c Jib \ubb38\uc11c\ub97c \ud655\uc778\ud574\ubd10\uc57c\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p><br><a href=\"https:\/\/github.com\/GoogleContainerTools\/jib\/tree\/master\/jib-gradle-plugin#extended-usage\" target=\"_blank\" rel=\"noopener\" title=\"\">jib-gradle-plugin \ubb38\uc11c<\/a>\ub97c \ud655\uc778\ud574\ubcf4\ub2c8 \uc544\ub798\uc640 \uac19\uc740 \uc635\uc158\uc774 \uc788\uc2b5\ub2c8\ub2e4. <\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><code>containerizingMode<\/code><\/td><td><code>String<\/code><\/td><td><code>exploded<\/code><\/td><td>If set to&nbsp;<code>packaged<\/code>, puts the JAR artifact built by the Gradle Java plugin into the final image. If set to&nbsp;<code>exploded<\/code>&nbsp;(default), containerizes individual&nbsp;<code>.class<\/code>&nbsp;files and resources files.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\uc624! \ubb38\uc81c \ud574\uacb0\uc5d0 \uac70\uc758 \ub3c4\ub2ec\ud55c \uac83 \uac19\uc2b5\ub2c8\ub2e4!<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2>Solution<\/h2>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"jib {\n    containerizingMode = &quot;packaged&quot; \/\/ \ucd94\uac00\n    from {\n        image = &quot;amazoncorretto:21-al2023-jdk&quot;\n    }\n    ...\n}\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">jib<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    containerizingMode <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">&quot;packaged&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #6272A4\">\/\/ \ucd94\uac00<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">from<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        image <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">&quot;amazoncorretto:21-al2023-jdk&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">..<\/span><span style=\"color: #F8F8F2\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#efefe1;font-size:12px;line-height:1;position:relative\">Kotlin<\/span><\/div>\n\n\n\n<p><code>jib.containerizingMode=\"packaged\"<\/code> \ub85c \uc124\uc815\ud574\uc11c \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uadf8\ub7f0\ub370 \uc5ec\uae30\uc5d0\uc11c \ud55c\uac00\uc9c0 \uc758\ubb38\uc774 \ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. \uc65c Jib\ub294 \uc774\ubbf8\uc9c0 \ub0b4\uc5d0 \ub2e8\uc77c Fat jar\ub85c \ud328\ud0a4\uc9d5\ud558\uc9c0 \uc54a\uace0, \ubaa8\ub4e0 \ud30c\uc77c\ub4e4\uc744 \ud480\uc5b4\uc11c \ud328\ud0a4\uc9d5\ud588\uc744\uae4c\uc694? \uac10\uc774 \uc788\uc73c\uc2e0 \ubd84\uc740 \uc544\uc2dc\uaca0\uc9c0\ub9cc \uadf8 \uc774\uc57c\uae30\ub97c \ud55c \ubc88 \ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h3>No Fat Jar<\/h3>\n\n\n\n<p>\uc544\uc2dc\ub2e4\uc2dc\ud53c Docker \uc774\ubbf8\uc9c0\ub294 \ub808\uc774\uc5b4\ub85c \ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<br>\ud558\uc9c0\ub9cc Fat jar\ub97c \uc0ac\uc6a9\ud558\uac8c \ub418\uba74 \uc544\ub798\ucc98\ub7fc jar\uc758 \ud06c\uae30\ub9cc\ud07c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uacfc \uad00\ub828\ud55c \ub808\uc774\uc5b4\uac00 \ucee4\uc9c0\uac8c \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/redutan.synology.me\/wordpress\/wp-content\/uploads\/2024\/04\/image-2.png\" alt=\"\" class=\"wp-image-180\" width=\"445\" height=\"266\" srcset=\"https:\/\/redutan.synology.me\/wordpress\/wp-content\/uploads\/2024\/04\/image-2.png 341w, https:\/\/redutan.synology.me\/wordpress\/wp-content\/uploads\/2024\/04\/image-2-300x179.png 300w\" sizes=\"(max-width: 445px) 100vw, 445px\" \/><figcaption class=\"wp-element-caption\">\ucd9c\ucc98: <a href=\"https:\/\/phauer.com\/2019\/no-fat-jar-in-docker-image\/\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/phauer.com\/2019\/no-fat-jar-in-docker-image\/<\/a><\/figcaption><\/figure>\n\n\n\n<p>\uadf8\ub7fc \ubc30\ud3ec\ubcf8 jar \ud06c\uae30 \ubcc4\ub85c \uc99d\ubd84\ub418\ub124\uc694.<\/p>\n\n\n\n<p><br>\ud558\uc9c0\ub9cc \uc2e4\uc7ac Fat jar\uc758 \ub0b4\uc6a9\uc744 \uc0b4\ud3b4\ubcf4\uba74 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/redutan.synology.me\/wordpress\/wp-content\/uploads\/2024\/04\/image-3.png\" alt=\"\" class=\"wp-image-181\" width=\"473\" height=\"219\" srcset=\"https:\/\/redutan.synology.me\/wordpress\/wp-content\/uploads\/2024\/04\/image-3.png 401w, https:\/\/redutan.synology.me\/wordpress\/wp-content\/uploads\/2024\/04\/image-3-300x139.png 300w\" sizes=\"(max-width: 473px) 100vw, 473px\" \/><figcaption class=\"wp-element-caption\">\ucd9c\ucc98: <a href=\"https:\/\/phauer.com\/2019\/no-fat-jar-in-docker-image\/\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/phauer.com\/2019\/no-fat-jar-in-docker-image\/<\/a><\/figcaption><\/figure>\n\n\n\n<p>\uc704\uc5d0 \ubcf4\uc2dc\ub294 \ubc14\uc640 \uac19\uc774 \uc758\uc874\uc131 \ub77c\uc774\ube0c\ub7ec\ub9ac(jars)\uac00 \ub300\ubd80\ubd84\uc744 \ucc28\uc9c0\ud558\uace0 \uc788\uace0, \uadf8 \uc678 Resouce(non classe)\uc640 \ucf54\ub4dc(class)\uac00 \uc788\ub124\uc694. \uc2e4\uc81c \uc6b0\ub9ac\uac00 \uc790\uc8fc \ubcc0\uacbd\ud558\ub294 \ucf54\ub4dc\uac00 \uac00\uc7a5 \uc6a9\ub7c9\uc774 \uc801\ub124\uc694. <\/p>\n\n\n\n<p><strong>\ub9cc\uc57d \ucf54\ub4dc\ub9cc \ubcc0\uacbd\ud574\uc11c \uc7ac\ubc30\ud3ec \ud558\ub294 \uacbd\uc6b0 \uc2e4\uc81c \ubcc0\uacbd\ub41c \ucf54\ub4dc 2MB\ub9cc \uc99d\ubd84\ud558\uba74 \ub418\ub294\ub370, Fat jar\ub85c \ubc30\ud3ec\ud558\uba74 \uc804\uccb4 \ud328\ud0a4\uc9c0 \uc0ac\uc774\uc988\uc778 72MB \ub9cc\ud07c \uc99d\ubd84\ub429\ub2c8\ub2e4. \uc815\ub9d0 \ube44\ud6a8\uc728\uc801\uc774\ub77c\uace0 \ubcf4\uc785\ub2c8\ub2e4.<\/strong><\/p>\n\n\n\n<p>\uadf8\ub798\uc11c Jib\ub294 \uc774\ub7ec\ud55c \ub0ad\ube44\ub97c \uc904\uc774\uace0 \uc99d\ubd84 \ube4c\ub4dc \ud6a8\uc728\uc744 \ucd5c\ub300\ud55c \ub0b4\uae30 \uc704\ud574\uc11c \uc544\ub798\uc640 \uac19\uc740 \uad6c\uc870\ub85c \ucee8\ud14c\uc774\ub108 \uc774\ubbf8\uc9c0\ub97c \ube4c\ub4dc\ud558\uac8c \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/redutan.synology.me\/wordpress\/wp-content\/uploads\/2024\/04\/image-4.png\" alt=\"\" class=\"wp-image-182\" width=\"455\" height=\"437\" srcset=\"https:\/\/redutan.synology.me\/wordpress\/wp-content\/uploads\/2024\/04\/image-4.png 321w, https:\/\/redutan.synology.me\/wordpress\/wp-content\/uploads\/2024\/04\/image-4-300x288.png 300w\" sizes=\"(max-width: 455px) 100vw, 455px\" \/><figcaption class=\"wp-element-caption\">\ucd9c\ucc98: <a href=\"https:\/\/phauer.com\/2019\/no-fat-jar-in-docker-image\/\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/phauer.com\/2019\/no-fat-jar-in-docker-image\/<\/a><\/figcaption><\/figure>\n\n\n\n<p>\uc774\uc804\uc5d0 Pod\uc5d0 \uc811\uc18d\ud574\uc11c \ud655\uc778\ud588\ub358 \ub514\ub809\ud1a0\ub9ac \uad6c\uc870\ub85c \ud655\uc778\ub418\ub124\uc694.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"bash-5.2# tree -d -L 1\n.\n\u251c\u2500\u2500 classes\n\u251c\u2500\u2500 libs\n\u2514\u2500\u2500 resources\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">bash-5.2#<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">tree<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-d<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">-L<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #8BE9FD\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">\u251c\u2500\u2500<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">classes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">\u251c\u2500\u2500<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">libs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">\u2514\u2500\u2500<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">resources<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#efefe1;font-size:12px;line-height:1;position:relative\">Bash<\/span><\/div>\n\n\n\n<ul>\n<li>classes: Code<\/li>\n\n\n\n<li>libs: Dependencies<\/li>\n\n\n\n<li>resources: Resources<\/li>\n<\/ul>\n\n\n\n<p>\uc774\ub7ec\ud55c \uc0ac\uc2e4\uc744 \uc54c\uac8c\ub418\ub2c8 <code>jib.containerizingMode=\"packaged\"<\/code> \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc544\uc57c\uaca0\uad70\uc694.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p><strong>Checkpoint<\/strong><\/p>\n<cite><code>\ucee8\ud14c\uc774\ub108 \uc774\ubbf8\uc9c0 \ub808\uc774\uc5b4\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \uc99d\ubd84<\/code>!<\/cite><\/blockquote>\n\n\n\n<p><\/p>\n\n\n\n<h2>Solution 2.<\/h2>\n\n\n\n<p>\uadf8\ub807\ub2e4\uba74 \ub2e4\uc2dc \uc6d0\uc810\uc73c\ub85c \ub3cc\uc544\uac00\uc11c <code>jib.containerizingMode=\"exploded\"<\/code>(default) \uc635\uc158\uc73c\ub85c \ud574\uacb0\ud574\ubd10\uc57c\uaca0\ub124\uc694. \uc774\ubbf8 github \uc774\uc288\ub85c \ub4f1\ub85d\ub418\uc5b4 \uc788\uc5c8\ub124\uc694.<\/p>\n\n\n\n<ul>\n<li><a href=\"https:\/\/github.com\/GoogleContainerTools\/jib\/issues\/2336\" target=\"_blank\" rel=\"noopener\" title=\"\">jib packages spring boot devtools&nbsp;#2336<\/a><\/li>\n<\/ul>\n\n\n\n<p>\uadf8 \uacb0\uacfc \uc544\ub798\uc640 \uac19\uc740 Jib Extensions \uac00 \uc0dd\uc131\ub410\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/GoogleContainerTools\/jib-extensions\/tree\/master\/first-party\/jib-spring-boot-extension-gradle\">https:\/\/github.com\/GoogleContainerTools\/jib-extensions\/tree\/master\/first-party\/jib-spring-boot-extension-gradle<\/a><\/p>\n\n\n\n<p>\uc774\uac83\uc744 \ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\ud558\uba74 \ub429\ub2c8\ub2e4. (\ub9cc\uc57d spring-boot 2.3.0 \uc774\uc804\uc774\ub77c\uba74 <code>useDeprecatedExcludeDevtoolsOption<\/code> \uc744 <code>true<\/code>\ub85c \uc124\uc815\ud574\uc8fc\uc138\uc694 &#8211; \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 README.md \ucc38\uc870)<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"buildscript {\n    dependencies {\n        classpath(&quot;com.google.cloud.tools:jib-spring-boot-extension-gradle:0.1.0&quot;)\n    }\n}\n...\njib {\n    from {\n        image = &quot;amazoncorretto:21-al2023-jdk&quot;\n    }\n    to {\n        image = System.getenv(&quot;ECR_REGISTRY&quot;) + &quot;\/&quot; + System.getenv(&quot;ECR_REPOSITORY&quot;)\n        tags = setOf(System.getenv(&quot;IMAGE_TAG&quot;) ?: &quot;default_tag&quot;)\n    }\n    container {\n        jvmFlags = listOf(\n                System.getenv(&quot;JVM_XMS&quot;) ?: &quot;-Xms512m&quot;,\n                System.getenv(&quot;JVM_XMX&quot;) ?: &quot;-Xmx512m&quot;,\n                &quot;-javaagent:\/newrelic\/newrelic.jar&quot;\n        )\n    }\n    \/\/ \ucd94\uac00\ub41c JibSpringBootExtension\n    pluginExtensions{\n        pluginExtension {\n            implementation = &quot;com.google.cloud.tools.jib.gradle.extension.springboot.JibSpringBootExtension&quot;\n        }\n    }\n}\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">buildscript<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">dependencies<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #50FA7B\">classpath<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #F1FA8C\">&quot;com.google.cloud.tools:jib-spring-boot-extension-gradle:0.1.0&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">..<\/span><span style=\"color: #F8F8F2\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">jib<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">from<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        image <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">&quot;amazoncorretto:21-al2023-jdk&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">to<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        image <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> System.<\/span><span style=\"color: #50FA7B\">getenv<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #F1FA8C\">&quot;ECR_REGISTRY&quot;<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #FF79C6\">+<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">&quot;\/&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">+<\/span><span style=\"color: #F8F8F2\"> System.<\/span><span style=\"color: #50FA7B\">getenv<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #F1FA8C\">&quot;ECR_REPOSITORY&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        tags <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">setOf<\/span><span style=\"color: #F8F8F2\">(System.<\/span><span style=\"color: #50FA7B\">getenv<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #F1FA8C\">&quot;IMAGE_TAG&quot;<\/span><span style=\"color: #F8F8F2\">) ?: <\/span><span style=\"color: #F1FA8C\">&quot;default_tag&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">container<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        jvmFlags <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">listOf<\/span><span style=\"color: #F8F8F2\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                System.<\/span><span style=\"color: #50FA7B\">getenv<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #F1FA8C\">&quot;JVM_XMS&quot;<\/span><span style=\"color: #F8F8F2\">) ?: <\/span><span style=\"color: #F1FA8C\">&quot;-Xms512m&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                System.<\/span><span style=\"color: #50FA7B\">getenv<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #F1FA8C\">&quot;JVM_XMX&quot;<\/span><span style=\"color: #F8F8F2\">) ?: <\/span><span style=\"color: #F1FA8C\">&quot;-Xmx512m&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #F1FA8C\">&quot;-javaagent:\/newrelic\/newrelic.jar&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #6272A4\">\/\/ \ucd94\uac00\ub41c JibSpringBootExtension<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #50FA7B\">pluginExtensions<\/span><span style=\"color: #F8F8F2\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #50FA7B\">pluginExtension<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            implementation <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">&quot;com.google.cloud.tools.jib.gradle.extension.springboot.JibSpringBootExtension&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#efefe1;font-size:12px;line-height:1;position:relative\">Kotlin<\/span><\/div>\n\n\n\n<p>\ucd94\uac00\ud55c <code>JibSpringBootExtension<\/code> \ucf54\ub4dc\ub97c \ud655\uc778\ud574\ubcf4\ub2c8 Container \uc774\ubbf8\uc9c0 \ube4c\ub4dc \uc2dc <code>spring-boot-devtools-*.jar<\/code> \ud30c\uc77c\uc744 \uc81c\uc678\uc2dc\ud0a4\ub294 \ud544\ud130\uac00 \uc801\uc6a9\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"  static boolean isDevtoolsJar(File file) {\n    return file.getName().startsWith(&quot;spring-boot-devtools-&quot;) &amp;&amp;\n        file.getName().endsWith(&quot;.jar&quot;);\n  }\n...\n  static LayerObject filterOutDevtools(LayerObject layerObject) {\n    String dependencyLayerName = JavaContainerBuilder.LayerType.DEPENDENCIES.getName();\n    if (!dependencyLayerName.equals(layerObject.getName())) {\n      return layerObject;\n    }\n\n    FileEntriesLayer layer = (FileEntriesLayer) layerObject;\n    Predicate&lt;FileEntry&gt; notDevtoolsJar =\n        fileEntry -&gt; !isDevtoolsJar(fileEntry.getSourceFile().toFile());\n    List&lt;FileEntry&gt; newEntries =\n        layer.getEntries().stream().filter(notDevtoolsJar).collect(Collectors.toList());\n    return layer.toBuilder().setEntries(newEntries).build();\n  }\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #FF79C6\">static<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">boolean<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">isDevtoolsJar<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #8BE9FD; font-style: italic\">File<\/span><span style=\"color: #F8F8F2\"> file) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> file.<\/span><span style=\"color: #50FA7B\">getName<\/span><span style=\"color: #F8F8F2\">().<\/span><span style=\"color: #50FA7B\">startsWith<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">spring-boot-devtools-<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #FF79C6\">&amp;&amp;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        file.<\/span><span style=\"color: #50FA7B\">getName<\/span><span style=\"color: #F8F8F2\">().<\/span><span style=\"color: #50FA7B\">endsWith<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">.jar<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #FF79C6\">static<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD; font-style: italic\">LayerObject<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">filterOutDevtools<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #8BE9FD; font-style: italic\">LayerObject<\/span><span style=\"color: #F8F8F2\"> layerObject) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #8BE9FD; font-style: italic\">String<\/span><span style=\"color: #F8F8F2\"> dependencyLayerName <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> JavaContainerBuilder.LayerType.DEPENDENCIES.<\/span><span style=\"color: #50FA7B\">getName<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">if<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #FF79C6\">!<\/span><span style=\"color: #F8F8F2\">dependencyLayerName.<\/span><span style=\"color: #50FA7B\">equals<\/span><span style=\"color: #F8F8F2\">(layerObject.<\/span><span style=\"color: #50FA7B\">getName<\/span><span style=\"color: #F8F8F2\">())) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> layerObject;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #8BE9FD; font-style: italic\">FileEntriesLayer<\/span><span style=\"color: #F8F8F2\"> layer <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> (FileEntriesLayer) layerObject;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #8BE9FD; font-style: italic\">Predicate<\/span><span style=\"color: #F8F8F2\">&lt;FileEntry&gt; notDevtoolsJar <\/span><span style=\"color: #FF79C6\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        fileEntry <\/span><span style=\"color: #8BE9FD; font-style: italic\">-&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">!<\/span><span style=\"color: #50FA7B\">isDevtoolsJar<\/span><span style=\"color: #F8F8F2\">(fileEntry.<\/span><span style=\"color: #50FA7B\">getSourceFile<\/span><span style=\"color: #F8F8F2\">().<\/span><span style=\"color: #50FA7B\">toFile<\/span><span style=\"color: #F8F8F2\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #8BE9FD; font-style: italic\">List<\/span><span style=\"color: #F8F8F2\">&lt;FileEntry&gt; newEntries <\/span><span style=\"color: #FF79C6\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        layer.<\/span><span style=\"color: #50FA7B\">getEntries<\/span><span style=\"color: #F8F8F2\">().<\/span><span style=\"color: #50FA7B\">stream<\/span><span style=\"color: #F8F8F2\">().<\/span><span style=\"color: #50FA7B\">filter<\/span><span style=\"color: #F8F8F2\">(notDevtoolsJar).<\/span><span style=\"color: #50FA7B\">collect<\/span><span style=\"color: #F8F8F2\">(Collectors.<\/span><span style=\"color: #50FA7B\">toList<\/span><span style=\"color: #F8F8F2\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">return<\/span><span style=\"color: #F8F8F2\"> layer.<\/span><span style=\"color: #50FA7B\">toBuilder<\/span><span style=\"color: #F8F8F2\">().<\/span><span style=\"color: #50FA7B\">setEntries<\/span><span style=\"color: #F8F8F2\">(newEntries).<\/span><span style=\"color: #50FA7B\">build<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  }<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#efefe1;font-size:12px;line-height:1;position:relative\">Java<\/span><\/div>\n\n\n\n<p>\uc774\ub85c\uc368 \uc774\uc288\uac00 \ud574\uacb0\ub410\ub124\uc694. \ud83d\ude00<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2>Refs.<\/h2>\n\n\n\n<ul>\n<li><a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/htmlsingle\/#using.devtools\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/htmlsingle\/#using.devtools<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/kubernetes.io\/ko\/docs\/concepts\/workloads\/controllers\/cron-jobs\/\">https:\/\/kubernetes.io\/ko\/docs\/concepts\/workloads\/controllers\/cron-jobs\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/kubernetes.io\/ko\/docs\/concepts\/workloads\/controllers\/job\/\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/kubernetes.io\/ko\/docs\/concepts\/workloads\/controllers\/job\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/GoogleContainerTools\/jib\/issues\/2336\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/github.com\/GoogleContainerTools\/jib\/issues\/2336<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/GoogleContainerTools\/jib-extensions\/pull\/31\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/github.com\/GoogleContainerTools\/jib-extensions\/pull\/31<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/phauer.com\/2019\/no-fat-jar-in-docker-image\/\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/phauer.com\/2019\/no-fat-jar-in-docker-image\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/GoogleContainerTools\/jib-extensions\/tree\/master\/first-party\/jib-spring-boot-extension-gradle\">https:\/\/github.com\/GoogleContainerTools\/jib-extensions\/tree\/master\/first-party\/jib-spring-boot-extension-gradle<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Problem Production \ud658\uacbd \uc2a4\ucf00\uc904\ub9c1\ub41c \ubc30\uce58(k8s CronJob)\uac00 \uc2e4\ud328\ub418\ub294 \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud558\uc600\uc2b5\ub2c8\ub2e4. \uc5ec\uae30\uc5d0 back-off \uc815\ucc45\uae4c\uc9c0 \ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc5b4\uc11c \uac19\uc740 \ubc30\uce58\uac00 \uc5ec\ub7ec\ubc88 \uc2e4\ud589\uae4c\uc9c0 \ub418\uc5c8\uc2b5\ub2c8\ub2e4.(k8s\uc5d0\uc11c .spec.backOffLimit \uac00 0 \uc774\uc0c1\uc774\uba74 \uc7ac\uc2dc\ub3c4\ud558\uac8c \ub429\ub2c8\ub2e4.) \uadf8\ub7f0\ub370 \uc911\uc694\ud55c \uac83\uc740 \uc774 \ubc30\uce58 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 \uc131\uacf5\ud588\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \uc131\uacf5\ud588\ub294\ub370 \uc65c exit \ucf54\ub4dc\uac00 0\uc774 \uc544\ub2cc \uac12\uc774 \ub098\uc654\ub294\uc9c0 \uc758\ubb38\uc774\uc5c8\uc2b5\ub2c8\ub2e4. spring-boot application exit code \uc544\ub798\ub294 \ubc30\uce58 \uad00\ub828 \ucf54\ub4dc \uc911 \uc77c\ubd80\uc785\ub2c8\ub2e4. \ubcf4\uc2dc\ub2e4\uc2dc\ud53c \ubc30\uce58\uc758 \uc2dc\uc791, &#8230; <a title=\"jib with spring-boot-devtools\" class=\"read-more\" href=\"https:\/\/redutan.synology.me\/wordpress\/2024\/04\/11\/jib-with-spring-boot-devtools\/\" aria-label=\"Read more about jib with spring-boot-devtools\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":181,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[28],"tags":[29,9,25,27,7,26],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/posts\/161"}],"collection":[{"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/comments?post=161"}],"version-history":[{"count":15,"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/posts\/161\/revisions"}],"predecessor-version":[{"id":188,"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/posts\/161\/revisions\/188"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/media\/181"}],"wp:attachment":[{"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/media?parent=161"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/categories?post=161"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/redutan.synology.me\/wordpress\/wp-json\/wp\/v2\/tags?post=161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}