{"id":33067,"date":"2024-01-11T00:48:30","date_gmt":"2023-10-26T07:55:36","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82\/"},"modified":"2024-05-04T17:48:21","modified_gmt":"2024-05-04T09:48:21","slug":"%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82\/","title":{"rendered":"\u5c06Spring Boot\u540e\u7aef\u548cTypeScript\u524d\u7aef\u653e\u5165\u5bb9\u5668\u4e2d"},"content":{"rendered":"<p>\u4f60\u597d\u3002\u6bcf\u5230\u661f\u671f\u4e94\uff0c\u6211\u5c31\u4f1a\u60f3\u8981\u89c2\u770b\u52a8\u753b\u7535\u5f71\u3002\u6211\u662fDocker\u5927\u53d4\u3002<br \/>\n\u5728\u4e0a\u4e00\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u4f7f\u7528Nginx\u5c06\u524d\u7aef\u548c\u540e\u7aef\u8fde\u63a5\u5230\u540c\u4e00\u4e2a\u7aef\u53e3\u4e0a\u8fdb\u884c\u8bbf\u95ee\u3002<br \/>\n\u8fd9\u6b21\uff0c\u6211\u6253\u7b97\u5c06\u524d\u7aef\u548c\u540e\u7aef\u5206\u522b\u653e\u5728Docker\u5bb9\u5668\u4e2d\u5e76\u542f\u52a8\u3002<\/p>\n<h2>\u73af\u5883\u4fe1\u606f<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Docker version 20.10.17, build 100c70180f<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">docker-compose version 1.21.2, build a133471<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">nginx version: nginx\/1.22.1<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Node.js v18.14.2 (npm 9.5.0)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Java OpenJDK Runtime Environment Microsoft-7209853 (build 17.0.6+10-LTS)<\/ul>\n<p>\u540c\u65f6\uff0c\u524d\u7aef\/\u540e\u7aef\u7684\u6e90\u4ee3\u7801\u5c06\u4f7f\u7528\u4e0e\u4e0a\u7bc7\u6587\u7ae0\u76f8\u540c\u7684\u7248\u672c\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30d5\u30ed\u30f3\u30c8: TypeScript + React + MUI<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u30d0\u30c3\u30af: Java + Spring boot + gradle<\/ul>\n<h2>\u5bb9\u5668\u7684\u7ec4\u6210<\/h2>\n<p>\u8fd9\u6b21\u6211\u5c06\u5c1d\u8bd5\u4e24\u79cd\u65b9\u6cd5\uff0c\u7b2c\u4e00\u79cd\u65b9\u6cd5\u662f\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u2460Nginx, \u30d5\u30ed\u30f3\u30c8, \u30d0\u30c3\u30af\u3000\u5168\u3066\u304c\u5225\u30b3\u30f3\u30c6\u30ca\u306b\u4e57\u3063\u304b\u3063\u3066\u3044\u308b\u30d1\u30bf\u30fc\u30f3<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u2461Nginx\u3068\u30d5\u30ed\u30f3\u30c8\u30921\u30b3\u30f3\u30c6\u30ca\u306b\u307e\u3068\u3081\u3066\u304a\u308a\u3001\u30d0\u30c3\u30af\u306f\u5225\u30b3\u30f3\u30c6\u30ca\u306e\u30d1\u30bf\u30fc\u30f3<\/ul>\n<h2>\u76ee\u5f55\u7ed3\u6784<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nb\">.<\/span>\r\n\u251c\u2500\u2500 docker-compose.yml\r\n\u251c\u2500\u2500 front\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 node_modules\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 package.json\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 package-lock.json\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 public\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 README.md\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 src\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 App.tsx\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 index.tsx\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 logo.svg\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 react-app-env.d.ts\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 reportWebVitals.ts\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 setupTests.ts\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 tsconfig.json\r\n\u2502\r\n\u251c\u2500\u2500 README.md\r\n\u2502\r\n\u2514\u2500\u2500 spring\r\n    \u251c\u2500\u2500 build.gradle\r\n    \u251c\u2500\u2500 gradle\r\n    \u251c\u2500\u2500 gradlew\r\n    \u251c\u2500\u2500 gradlew.bat\r\n    \u251c\u2500\u2500 README.md\r\n    \u251c\u2500\u2500 settings.gradle\r\n    \u2514\u2500\u2500 src\r\n        \u251c\u2500\u2500 main\r\n        \u2502\u00a0\u00a0 \u251c\u2500\u2500 java\r\n        \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 ...\r\n        \u2502\u00a0\u00a0 \u2514\u2500\u2500 resources\r\n        \u2502\u00a0\u00a0     \u2514\u2500\u2500 application.yml\r\n        \u2514\u2500\u2500 <span class=\"nb\">test<\/span>\r\n            \u251c\u2500\u2500 java\r\n            \u2502\u00a0\u00a0 \u2514\u2500\u2500 ...\r\n            \u2514\u2500\u2500 resources\r\n                \u2514\u2500\u2500 application.yml\r\n\r\n<\/code><\/pre>\n<p>\u6211\u628adocker-compose.yml\u6587\u4ef6\u653e\u5728\u6839\u76ee\u5f55\u4e0b\uff0c\u5e76\u5728\u5176\u4e2d\u52a0\u5165\u4e86\u4ee5\u4e0b\u5185\u5bb9\uff1a<br \/>\n&#8211; &#8220;front&#8221;\uff1a\u524d\u7aef\u6e90\u4ee3\u7801\uff0c<br \/>\n&#8211; &#8220;spring&#8221;\uff1a\u540e\u7aef\u6e90\u4ee3\u7801\u3002<\/p>\n<h2>\u8ba9\u6211\u4eec\u8bd5\u4e00\u8bd5 sh\u00ec y\u012b sh\u00ec)<\/h2>\n<h3>\u2460Nginx\u3001\u524d\u7aef\u548c\u540e\u7aef\u5747\u4ee5\u72ec\u7acb\u7684\u5bb9\u5668\u90e8\u7f72\u7684\u6a21\u5f0f<\/h3>\n<h4>\u5bb9\u5668\u7684\u914d\u7f6e\u56fe\u50cf<\/h4>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d157437434c4406bfe760\/14-0.png\" alt=\"pattern1.png\" \/><\/div>\n<h4>\u51c6\u5907Nginx\u5bb9\u5668\u3002<\/h4>\n<h5>nginx\u914d\u7f6e\u6587\u4ef6\u7684\u63cf\u8ff0<\/h5>\n<p>\u5728\u6839\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a nginx\/conf\/ \u76ee\u5f55\uff0c\u5e76\u653e\u7f6e\u4ee5\u4e0b\u7c7b\u4f3c\u7684 nginx.conf \u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"n\">server<\/span> {\r\n    <span class=\"c\"># Nginx\u304clocalhost:80\u3067\u30a2\u30af\u30bb\u30b9\u3092\u53d7\u3051\u4ed8\u3051\u307e\u3059\u3002\r\n<\/span>    <span class=\"n\">listen<\/span>       <span class=\"m\">80<\/span>;\r\n    <span class=\"n\">server_name<\/span>  <span class=\"n\">localhost<\/span>;\r\n    <span class=\"n\">proxy_set_header<\/span>    <span class=\"n\">Host<\/span>    $<span class=\"n\">host<\/span>;\r\n    <span class=\"n\">proxy_set_header<\/span>    <span class=\"n\">X<\/span>-<span class=\"n\">Real<\/span>-<span class=\"n\">IP<\/span>    $<span class=\"n\">remote_addr<\/span>;\r\n    <span class=\"n\">proxy_set_header<\/span>    <span class=\"n\">X<\/span>-<span class=\"n\">Forwarded<\/span>-<span class=\"n\">Host<\/span>       $<span class=\"n\">host<\/span>;\r\n    <span class=\"n\">proxy_set_header<\/span>    <span class=\"n\">X<\/span>-<span class=\"n\">Forwarded<\/span>-<span class=\"n\">Server<\/span>    $<span class=\"n\">host<\/span>;\r\n    <span class=\"n\">proxy_set_header<\/span>    <span class=\"n\">X<\/span>-<span class=\"n\">Forwarded<\/span>-<span class=\"n\">For<\/span>    $<span class=\"n\">proxy_add_x_forwarded_for<\/span>;\r\n\r\n    <span class=\"c\"># \"http:\/\/&lt;nginx\u30b3\u30f3\u30c6\u30ca&gt;:80\/\"\u914d\u4e0b\u306e\u30a2\u30af\u30bb\u30b9\u306ffront\u30b3\u30f3\u30c6\u30ca\u306e3000\u756a\u30dd\u30fc\u30c8\u306b\u8ee2\u9001\u3057\u307e\u3059\u3002\r\n<\/span>    <span class=\"n\">location<\/span> \/ {\r\n        <span class=\"n\">proxy_pass<\/span>    <span class=\"n\">http<\/span>:\/\/<span class=\"n\">front<\/span>:<span class=\"m\">3000<\/span>\/;\r\n    }\r\n\r\n    <span class=\"c\"># \"http:\/\/&lt;nginx\u30b3\u30f3\u30c6\u30ca&gt;:80\/api\/\"\u914d\u4e0b\u306e\u30a2\u30af\u30bb\u30b9\u306fspring\u30b3\u30f3\u30c6\u30ca\u306e8080\u756a\u30dd\u30fc\u30c8\u306b\u8ee2\u9001\u3057\u307e\u3059\u3002\r\n<\/span>    <span class=\"n\">location<\/span> \/<span class=\"n\">api<\/span>\/ {\r\n        <span class=\"n\">proxy_pass<\/span>    <span class=\"n\">http<\/span>:\/\/<span class=\"n\">spring<\/span>:<span class=\"m\">8080<\/span>\/<span class=\"n\">api<\/span>\/;\r\n    }\r\n}\r\n<\/code><\/pre>\n<h5>\u51c6\u5907Dockerfile\u3002<\/h5>\n<p>\u51c6\u5907\u4ee5\u4e0b\u7c7b\u4f3c\u7684Dockerfile\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> nginx:1.22.1<\/span>\r\n\r\n<span class=\"c\"># \u30d9\u30fc\u30b9\u30a4\u30e1\u30fc\u30b8\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3092\u81ea\u524d\u306b\u7f6e\u63db<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">rm<\/span> \/etc\/nginx\/conf.d\/default.conf\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> .\/conf\/nginx.conf \/etc\/nginx\/conf.d<\/span>\r\n\r\n<span class=\"k\">CMD<\/span><span class=\"s\"> [\"nginx\", \"-g\", \"daemon off;\"]<\/span>\r\n<\/code><\/pre>\n<h4>\u51c6\u5907\u524d\u53f0\u5bb9\u5668<\/h4>\n<p>\u5728\u524d\u7aef\u6587\u4ef6\u5939\u7684\u6839\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u5982\u4e0b\u6240\u793a\u7684Dockerfile\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># \u30ed\u30fc\u30ab\u30eb\u3067\u4f7f\u3063\u3066\u3044\u308bNode.js\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3068\u6700\u3082\u8fd1\u3044\u3082\u306e\u3092\u4f7f\u7528<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> node:18.15.0<\/span>\r\n\r\n<span class=\"c\"># \u30b3\u30f3\u30c6\u30ca\u306e\u4f5c\u696d\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\/app\u914d\u4e0b\u306b\u8a2d\u5b9a<\/span>\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/app<\/span>\r\n\r\n<span class=\"c\"># \/front\u914d\u4e0b\u3059\u3079\u3066\u3092\/app\u914d\u4e0b\u306b\u6301\u3063\u3066\u3044\u304f<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> .\/* \/app\/<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> public\/ \/app\/public\/<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> src\/ \/app\/src\/<\/span>\r\n\r\n<span class=\"c\"># \u5fc5\u8981\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5168\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/span>\r\n<span class=\"k\">RUN <\/span>npm <span class=\"nb\">install<\/span>\r\n\r\n<span class=\"c\"># \u30b3\u30f3\u30c6\u30ca\u8d77\u52d5\u3068\u540c\u6642\u306b\"npm start\"\u304c\u8d70\u308b<\/span>\r\n<span class=\"k\">ENTRYPOINT<\/span><span class=\"s\"> [ \"npm\", \"start\" ]<\/span>\r\n<\/code><\/pre>\n<p>\u6211\u5c06\u4f7f\u7528docker-compose\u6765\u8fd0\u884c\u5b83\u3002<\/p>\n<h5>\u524d\u65b9\u5bb9\u5668\u7684\u64cd\u4f5c\u786e\u8ba4<\/h5>\n<p>\u6211\u4eec\u5148\u8bd5\u7740\u786e\u8ba4\u4e00\u4e0b\u52a8\u4f5c\uff0c\u6267\u884c\u4e0b\u9762\u7684\u6307\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">cd<\/span> &lt;\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30eb\u30fc\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea&gt;\/front\r\n<span class=\"c\"># \u30b3\u30f3\u30c6\u30ca\u30a4\u30e1\u30fc\u30b8\u306e\u30d3\u30eb\u30c9<\/span>\r\ndocker build <span class=\"nt\">-t<\/span> front <span class=\"nb\">.<\/span>\r\n<span class=\"c\"># \"front\"\u3068\u3044\u3046\u30b3\u30f3\u30c6\u30ca\u30a4\u30e1\u30fc\u30b8\u3092\"front\"\u3068\u3044\u3046\u540d\u524d\u3067\u8d77\u52d5<\/span>\r\ndocker run <span class=\"nt\">-itd<\/span> <span class=\"nt\">-p<\/span> 3000:3000 <span class=\"nt\">--name<\/span> front front\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d157437434c4406bfe760\/29-0.png\" alt=\"loading.png\" \/><\/div>\n<h4>\u51c6\u5907\u540e\u7aef\u5bb9\u5668<\/h4>\n<p>\u51c6\u5907Spring Boot\u7684\u540e\u7aef\u5bb9\u5668\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30bd\u30fc\u30b9\u304b\u3089\u30d3\u30eb\u30c9\u3057\u305f\u3044<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30d3\u30eb\u30c9\u3055\u308c\u305fjar\u30d5\u30a1\u30a4\u30eb\u540d\u306f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3054\u3068\u306b\u53ef\u5909\u3068\u306a\u308b\u305f\u3081\u3001\u30d3\u30eb\u30c9\u6642\u306b\u6307\u5b9a\u3057\u305f\u3044<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u6700\u7d42\u7684\u306b\u5b9f\u884c\u3059\u308b\u30b3\u30f3\u30c6\u30ca\u306b\u306fjar\u30d5\u30a1\u30a4\u30eb\u3060\u3051\u304c\u3042\u308c\u3070\u3044\u3044<\/ul>\n<p>\u5728\u8fd9\u4e2a\u6761\u4ef6\u4e0b\uff0c\u4f7f\u7528\u591a\u9636\u6bb5\u6784\u5efa\u3002<\/p>\n<p>\u6211\u5c06\u5199\u4e0b\u4e00\u4e2a\u4e0e\u4e0b\u9762\u7684Dockerfile\u7c7b\u4f3c\u7684\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># \u30bd\u30fc\u30b9\u306e\u30d3\u30eb\u30c9\u7528\u30b3\u30f3\u30c6\u30ca<\/span>\r\n<span class=\"k\">FROM<\/span> <span class=\"s\">mcr.microsoft.com\/openjdk\/jdk:17-ubuntu<\/span> <span class=\"k\">AS<\/span> <span class=\"s\">builder<\/span>\r\n\r\n<span class=\"c\"># \u30bd\u30fc\u30b9\u3092\u5168\u3066\/app\u914d\u4e0b\u306b\u6301\u3063\u3066\u3044\u304f<\/span>\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/app<\/span>\r\n\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> .\/* .\/<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> .\/gradle\/ .\/gradle\/<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> .\/src\/ .\/src\/<\/span>\r\n\r\n<span class=\"c\"># sdkman!\u304b\u3089gradle\u3092\u5165\u624b\u2192\u30d1\u30b9\u3092\u901a\u3059<\/span>\r\n<span class=\"k\">RUN <\/span>apt-get update\r\n<span class=\"k\">RUN <\/span>apt-get <span class=\"nt\">-y<\/span> <span class=\"nb\">install <\/span>curl\r\n<span class=\"k\">RUN <\/span>apt-get <span class=\"nt\">-y<\/span> <span class=\"nb\">install <\/span>zip\r\n<span class=\"k\">RUN <\/span>curl <span class=\"nt\">-s<\/span> <span class=\"s2\">\"https:\/\/get.sdkman.io\"<\/span> | bash\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\". <\/span><span class=\"nv\">$HOME<\/span><span class=\"s2\">\/.sdkman\/bin\/sdkman-init.sh; sdk install gradle\"<\/span> | bash\r\n\r\n<span class=\"c\"># gradle build<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nv\">$HOME<\/span>\/.sdkman\/candidates\/gradle\/current\/bin\/gradle build\r\n\r\n<span class=\"c\"># \u5b9f\u969b\u306b\u52d5\u304b\u3059\u30b3\u30f3\u30c6\u30ca\u306e\u8a18\u8ff0<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> mcr.microsoft.com\/openjdk\/jdk:17-ubuntu<\/span>\r\n\r\n<span class=\"c\"># gradle build\u3067\u751f\u6210\u3055\u308c\u308b\u5b9f\u884c\u53ef\u80fdjar\u30d5\u30a1\u30a4\u30eb\u306e\u30d1\u30b9 \u30d5\u30a1\u30a4\u30eb\u540d\u3092build-arg\u3067\u53d7\u3051\u53d6\u308b<\/span>\r\n<span class=\"k\">ARG<\/span><span class=\"s\"> JAR_FILE_PATH=\"\/app\/build\/libs\/demo-0.0.1-SNAPSHOT.jar\"<\/span>\r\n\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/app<\/span>\r\n\r\n<span class=\"c\"># builder\u30b3\u30f3\u30c6\u30ca\u304b\u3089\u5b9f\u884c\u53ef\u80fdjar\u30d5\u30a1\u30a4\u30eb\u3092\u30b3\u30d4\u30fc jar\u30d5\u30a1\u30a4\u30eb\u540d\u306fbuild-arg\u304b\u3089\u53d7\u3051\u53d6\u308b<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> --from=builder ${JAR_FILE_PATH} .\/app.jar<\/span>\r\n\r\n<span class=\"k\">ENTRYPOINT<\/span><span class=\"s\"> [\"java\", \"-jar\", \"app.jar\"]<\/span>\r\n<\/code><\/pre>\n<h5>\u786e\u8ba4\u540e\u7aef\u5bb9\u5668\u7684\u64cd\u4f5c<\/h5>\n<p>\u6211\u4eec\u4e5f\u5148\u8bd5\u8bd5\u770b\u8fd9\u4e2a\u529f\u80fd\u662f\u5426\u6b63\u5e38\u8fd0\u4f5c\u3002<br \/>\n\u2460\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">cd<\/span> &lt;\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30eb\u30fc\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea&gt;\/spring\r\n<span class=\"c\"># \u30b3\u30f3\u30c6\u30ca\u30a4\u30e1\u30fc\u30b8\u306e\u30d3\u30eb\u30c9<\/span>\r\n<span class=\"c\"># \u4f8b: docker build --build-arg JAR_FILE_PATH=&lt;JAR\u30d5\u30a1\u30a4\u30eb\u306e\u30d5\u30eb\u30d1\u30b9&gt; -t spring .<\/span>\r\n<span class=\"c\"># \u751f\u6210\u3055\u308c\u308bjar\u30d5\u30a1\u30a4\u30eb\u540d\u304c\"demo-0.0.1-SNAPSHOT.jar\"\u3060\u3068\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/span>\r\ndocker build <span class=\"nt\">--build-arg<\/span> <span class=\"nv\">JAR_FILE_PATH<\/span><span class=\"o\">=<\/span>\/app\/build\/libs\/demo-0.0.1-SNAPSHOT.jar <span class=\"nt\">-t<\/span> spring <span class=\"nb\">.<\/span>\r\n<span class=\"c\"># \"spring\"\u3068\u3044\u3046\u30b3\u30f3\u30c6\u30ca\u30a4\u30e1\u30fc\u30b8\u3092\"spring\"\u3068\u3044\u3046\u540d\u524d\u3067\u8d77\u52d5<\/span>\r\ndocker run <span class=\"nt\">-itd<\/span> <span class=\"nt\">--name<\/span> spring spring\r\n<\/code><\/pre>\n<p>\u8bf7\u4f7f\u7528\u6d4f\u89c8\u5668\u8bbf\u95ee http:\/\/(docker\u8fd0\u884c\u73af\u5883\u7684\u4e3b\u673a):8080\/api\/hello<\/p>\n<pre class=\"post-pre\"><code>curl http:\/\/localhost:8080\/api\/hello\r\n<span class=\"o\">{<\/span><span class=\"s2\">\"jpn\"<\/span>:<span class=\"s2\">\"\u3053\u3093\u306b\u3061\u306f\"<\/span>,<span class=\"s2\">\"eng\"<\/span>:<span class=\"s2\">\"hello\"<\/span><span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u95ee\u5019\u5185\u5bb9\u4ee5JSON\u683c\u5f0f\u8fd4\u56de\uff0c\u90a3\u5c31\u7b97\u6210\u529f\u4e86\u3002<\/p>\n<h4>\u521b\u5efadocker-compose.yml<\/h4>\n<p>\u6700\u540e\uff0c\u6211\u4eec\u5c06\u7f16\u5199\u4e00\u4e2adocker-compose.yml\u6587\u4ef6\u6765\u6574\u5408\u4e0a\u8ff0\u4e09\u4e2a\u5bb9\u5668\u3002<\/p>\n<p>\u5728\u9879\u76ee\u7684\u6839\u76ee\u5f55\u4e0b\uff0c\u521b\u5efa\u4e00\u4e2a\u7c7b\u4f3c\u4e0b\u9762\u7684docker-compose.yml\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">3\"<\/span>\r\n<span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">nginx<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx<\/span> <span class=\"c1\">#nginx\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3067\u30b3\u30f3\u30c6\u30ca\u3092\u30d3\u30eb\u30c9\u3059\u308b<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx<\/span>\r\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">80:80<\/span> <span class=\"c1\"># 80\u756a\u30dd\u30fc\u30c8\u3092\u5185\u5916\u306b\u516c\u958b<\/span>\r\n\r\n  <span class=\"na\">front<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">front<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">front<\/span>\r\n    <span class=\"na\">restart<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always<\/span>\r\n    <span class=\"na\">expose<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">3000\"<\/span> <span class=\"c1\"># 3000\u756a\u30dd\u30fc\u30c8\u3092\u5185\u90e8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306b\u516c\u958b<\/span>\r\n    <span class=\"na\">depends_on<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">spring<\/span> <span class=\"c1\"># spring\u30b3\u30f3\u30c6\u30ca\u3088\u308a\u3082\u5f8c\u306b\u8d77\u52d5\u3055\u305b\u308b<\/span>\r\n\r\n  <span class=\"na\">spring<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">context<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring<\/span>\r\n      <span class=\"na\">args<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"s\">${JAR_FILE_PATH}<\/span><span class=\"err\">:<\/span> <span class=\"s\">\/app\/build\/libs\/demo-0.0.1-SNAPSHOT.jar<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring<\/span>\r\n    <span class=\"na\">restart<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always<\/span>\r\n    <span class=\"na\">expose<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">8080\"<\/span> <span class=\"c1\"># 8080\u756a\u30dd\u30fc\u30c8\u3092\u5185\u90e8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306b\u516c\u958b<\/span>\r\n<\/code><\/pre>\n<h4>\u521b\u5efa.env\u6587\u4ef6<\/h4>\n<p>\u5c06docker-compose.yml\u4e2d\u7684\u53ef\u53d8\u503c\u96c6\u4e2d\u5230.env\u6587\u4ef6\u4e2d\u3002<br \/>\n\u5728\u4e0edocker-compose.yml\u76f8\u540c\u7684\u5c42\u7ea7\u4e2d\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a&#8221;.env&#8221;\u7684\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>JAR_FILE_PATH=\/app\/build\/libs\/demo-0.0.1-SNAPSHOT.jar\r\n<\/code><\/pre>\n<h4>\u5bb9\u5668\u6784\u5efa<\/h4>\n<p>\u4f7f\u7528docker-compose\u547d\u4ee4\u542f\u52a8\u5bb9\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">cd<\/span> &lt;\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30eb\u30fc\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea&gt;\r\ndocker-compose up <span class=\"nt\">-d<\/span>\r\n<\/code><\/pre>\n<h5>\u78ba\u5b9a\u884c\u52d5<\/h5>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d157437434c4406bfe760\/53-0.png\" alt=\"success.png\" \/><\/div>\n<h3>\u5c06Nginx\u548c\u524d\u7aef\u6574\u5408\u5230\u4e00\u4e2a\u5bb9\u5668\u4e2d\uff0c\u800c\u540e\u7aef\u5219\u662f\u53e6\u4e00\u4e2a\u5bb9\u5668\u7684\u6a21\u5f0f\u3002<\/h3>\n<h4>\u5bb9\u5668\u7684\u6784\u6210\u56fe\u50cf<\/h4>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d157437434c4406bfe760\/56-0.png\" alt=\"pattern2.png\" \/><\/div>\n<h4>\u51c6\u5907\u524d\u53f0\u5bb9\u5668<\/h4>\n<h5>\u51c6\u5907nginx.conf\u6587\u4ef6<\/h5>\n<p>\u5728front\/nginx\/conf\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u540d\u4e3anginx.conf\u7684\u6587\u4ef6\uff0c\u6587\u4ef6\u5185\u5bb9\u5982\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"n\">server<\/span> {\r\n\r\n  <span class=\"n\">listen<\/span> <span class=\"m\">80<\/span>;\r\n\r\n  <span class=\"n\">location<\/span> \/ {\r\n    <span class=\"n\">root<\/span>   \/<span class=\"n\">usr<\/span>\/<span class=\"n\">share<\/span>\/<span class=\"n\">nginx<\/span>\/<span class=\"n\">html<\/span>;\r\n    <span class=\"n\">index<\/span>  <span class=\"n\">index<\/span>.<span class=\"n\">html<\/span> <span class=\"n\">index<\/span>.<span class=\"n\">htm<\/span>;\r\n    <span class=\"n\">try_files<\/span> $<span class=\"n\">uri<\/span> $<span class=\"n\">uri<\/span>\/ \/<span class=\"n\">index<\/span>.<span class=\"n\">html<\/span>;\r\n  }\r\n\r\n  <span class=\"n\">location<\/span> \/<span class=\"n\">api<\/span>\/ {\r\n      <span class=\"n\">proxy_pass<\/span> <span class=\"n\">http<\/span>:\/\/<span class=\"n\">spring<\/span>:<span class=\"m\">8080<\/span>;\r\n      <span class=\"n\">proxy_http_version<\/span> <span class=\"m\">1<\/span>.<span class=\"m\">1<\/span>;\r\n      <span class=\"n\">proxy_set_header<\/span> <span class=\"n\">Upgrade<\/span> $<span class=\"n\">http_upgrade<\/span>;\r\n      <span class=\"n\">proxy_set_header<\/span> <span class=\"n\">Connection<\/span> <span class=\"s1\">'upgrade'<\/span>;\r\n      <span class=\"n\">proxy_set_header<\/span> <span class=\"n\">Host<\/span> $<span class=\"n\">host<\/span>;\r\n      <span class=\"n\">proxy_cache_bypass<\/span> $<span class=\"n\">http_upgrade<\/span>;\r\n   }\r\n\r\n  <span class=\"n\">error_page<\/span>   <span class=\"m\">500<\/span> <span class=\"m\">502<\/span> <span class=\"m\">503<\/span> <span class=\"m\">504<\/span>  \/<span class=\"m\">50<\/span><span class=\"n\">x<\/span>.<span class=\"n\">html<\/span>;\r\n\r\n  <span class=\"n\">location<\/span> = \/<span class=\"m\">50<\/span><span class=\"n\">x<\/span>.<span class=\"n\">html<\/span> {\r\n    <span class=\"n\">root<\/span>   \/<span class=\"n\">usr<\/span>\/<span class=\"n\">share<\/span>\/<span class=\"n\">nginx<\/span>\/<span class=\"n\">html<\/span>;\r\n  }\r\n}\r\n<\/code><\/pre>\n<h5>\u51c6\u5907Dockerfile\u3002<\/h5>\n<p>\u6211\u4eec\u5c06\u4f7f\u7528\u591a\u9636\u6bb5\u6784\u5efa\u6765\u51c6\u5907\u524d\u7aef\u5bb9\u5668\u30023<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># \u30ed\u30fc\u30ab\u30eb\u3067\u4f7f\u3063\u3066\u3044\u308bNode.js\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3068\u6700\u3082\u8fd1\u3044\u3082\u306e\u3092\u4f7f\u7528<\/span>\r\n<span class=\"k\">FROM<\/span> <span class=\"s\">node:18.15.0<\/span> <span class=\"k\">AS<\/span> <span class=\"s\">builder<\/span>\r\n\r\n<span class=\"c\"># \u30b3\u30f3\u30c6\u30ca\u306e\u4f5c\u696d\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\/app\u914d\u4e0b\u306b\u8a2d\u5b9a<\/span>\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/app<\/span>\r\n\r\n<span class=\"c\"># \/front\u914d\u4e0b\u3059\u3079\u3066\u3092\/app\u914d\u4e0b\u306b\u6301\u3063\u3066\u3044\u304f<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> .\/* \/app\/<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> public\/ \/app\/public\/<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> src\/ \/app\/src\/<\/span>\r\n\r\n<span class=\"c\"># \u5fc5\u8981\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5168\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/span>\r\n<span class=\"k\">RUN <\/span>npm <span class=\"nb\">install<\/span>\r\n\r\n<span class=\"c\"># \u30d5\u30ed\u30f3\u30c8\u306e\u30bd\u30fc\u30b9\u3092\u30d3\u30eb\u30c9<\/span>\r\n<span class=\"k\">RUN <\/span>npm run build\r\n\r\n<span class=\"c\"># \u5b9f\u969b\u306b\u52d5\u304b\u3059\u30b3\u30f3\u30c6\u30ca<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> nginx:1.22.1<\/span>\r\n\r\n<span class=\"c\"># \u30d9\u30fc\u30b9\u30a4\u30e1\u30fc\u30b8\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3092\u81ea\u524d\u306b\u7f6e\u63db<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">rm<\/span> \/etc\/nginx\/conf.d\/default.conf\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> .\/nginx\/conf\/nginx.conf \/etc\/nginx\/conf.d<\/span>\r\n\r\n<span class=\"c\"># \u30d3\u30eb\u30c9\u3055\u308c\u305f\u30d5\u30ed\u30f3\u30c8\u306e\u30bd\u30fc\u30b9\u3092\u6301\u3063\u3066\u3044\u304f<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> --from=builder \/app\/build\/ \/usr\/share\/nginx\/html<\/span>\r\n\r\n<span class=\"k\">CMD<\/span><span class=\"s\"> [\"nginx\", \"-g\", \"daemon off;\"]<\/span>\r\n<\/code><\/pre>\n<h4>\u51c6\u5907\u540e\u7aef\u5bb9\u5668<\/h4>\n<p>\u540e\u7aef\u5bb9\u5668\u4e0e\u6a21\u5f0f1\u76f8\u540c\u3002<\/p>\n<h4>\u521b\u5efadocker-compose.yml\u6587\u4ef6<\/h4>\n<p>\u6700\u540e\uff0c\u6211\u4eec\u5c06\u63cf\u8ff0\u4e00\u4e2adocker-compose.yml\u6587\u4ef6\u6765\u6574\u5408\u4e0a\u9762\u63d0\u5230\u7684\u4e09\u4e2a\u5bb9\u5668\u3002<\/p>\n<p>\u5728\u9879\u76ee\u7684\u6839\u76ee\u5f55\u4e0b\uff0c\u521b\u5efa\u4e00\u4e2a\u540d\u4e3adocker-compose.yml\u7684\u6587\u4ef6\uff0c\u5185\u5bb9\u5982\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">3\"<\/span>\r\n<span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">front<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">front<\/span> <span class=\"c1\"># front\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3067\u30b3\u30f3\u30c6\u30ca\u3092\u30d3\u30eb\u30c9\u3059\u308b<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">front<\/span>\r\n    <span class=\"na\">restart<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always<\/span>\r\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">80:80<\/span> <span class=\"c1\"># 80\u756a\u30dd\u30fc\u30c8\u3092\u5185\u5916\u306b\u516c\u958b<\/span>\r\n    <span class=\"na\">depends_on<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">spring<\/span> <span class=\"c1\"># spring\u30b3\u30f3\u30c6\u30ca\u3088\u308a\u3082\u5f8c\u306b\u8d77\u52d5\u3055\u305b\u308b<\/span>\r\n\r\n  <span class=\"na\">spring<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">context<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring<\/span>\r\n      <span class=\"na\">args<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"s\">${JAR_FILE_PATH}<\/span><span class=\"err\">:<\/span> <span class=\"s\">\/app\/build\/libs\/demo-0.0.1-SNAPSHOT.jar<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring<\/span>\r\n    <span class=\"na\">restart<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always<\/span>\r\n    <span class=\"na\">expose<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">8080\"<\/span> <span class=\"c1\"># 8080\u756a\u30dd\u30fc\u30c8\u3092\u5185\u90e8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306b\u516c\u958b<\/span>\r\n\r\n<\/code><\/pre>\n<h4>\u521b\u5efa.env\u6587\u4ef6<\/h4>\n<p>\u5c06docker-compose.yml\u4e2d\u7684\u53ef\u53d8\u503c\u96c6\u4e2d\u5230.env\u6587\u4ef6\u4e2d\u3002<br \/>\n\u5728\u4e0edocker-compose.yml\u76f8\u540c\u7684\u5c42\u7ea7\u4e0b\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a&#8221;.env&#8221;\u7684\u6587\u4ef6\uff0c\u5185\u5bb9\u5982\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code>JAR_FILE_PATH=\/app\/build\/libs\/demo-0.0.1-SNAPSHOT.jar\r\n<\/code><\/pre>\n<h4>\u6784\u5efa\u5bb9\u5668<\/h4>\n<p>\u4f7f\u7528docker-compose\u547d\u4ee4\uff0c\u542f\u52a8\u5bb9\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">cd<\/span> &lt;\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30eb\u30fc\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea&gt;\r\ndocker-compose up <span class=\"nt\">-d<\/span>\r\n<\/code><\/pre>\n<h5>\u786e\u8ba4\u52a8\u4f5c<\/h5>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d157437434c4406bfe760\/77-0.png\" alt=\"success.png\" \/><\/div>\n<section>\u5c3d\u7ba1\u53ef\u4ee5\u5c06\u6240\u6709\u5185\u5bb9\u653e\u5165\u4e00\u4e2a\u5bb9\u5668\u4e2d\uff0c\u4f46\u662f\u4e00\u4e2a\u5bb9\u5668\u4e2d\u5305\u542b3\u4e2a\u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u4e14\u7531\u4e8e\u5176\u5bb9\u9519\u6027\u5dee\uff0c\u6240\u4ee5\u4ece\u5b9e\u7528\u6027\u7684\u89c2\u70b9\u6765\u770b\uff0c\u6211\u4eec\u51b3\u5b9a\u4e0d\u8fd9\u6837\u505a\u3002\u6211\u8ba4\u4e3a\u5728\u8fd9\u65b9\u9762\u5b58\u5728\u5404\u79cd\u4e0d\u540c\u7684\u6d3e\u7cfb\uff0c\u5e0c\u671b\u4e0d\u4f1a\u5bf9\u6b64\u611f\u5230\u53cd\u611f\u3002\u5728\u5b9e\u9645\u4e1a\u52a1\u7684CI\/CD\u73af\u5883\u4e2d\uff0c<br \/>\n1. \u6e90\u4ee3\u7801\u88ab\u5408\u5e76\u5230\u4e3b\u5206\u652f\u4e2d\uff0c<br \/>\n2. \u6784\u5efa\u5de5\u5177\u68c0\u6d4b\u5e76\u751f\u6210jar\u6587\u4ef6\u3002<br \/>\n3. \u5728docker build\u9636\u6bb5\uff0c\u53ea\u9700\u5c06\u5176\u590d\u5236\u5e76\u542f\u52a8\u5373\u53ef\uff0c\u6211\u8ba4\u4e3a\u8fd9\u79cd\u65b9\u6cd5\u662f\u73b0\u5b9e\u53ef\u884c\u7684\u3002<\/p>\n<p>\u5bf9\u4e8e\u524d\u7aef\uff0c\u5728\u5b9e\u9645\u4e1a\u52a1\u7684CI\/CD\u73af\u5883\u4e2d\uff0c<br \/>\n1. \u6e90\u4ee3\u7801\u88ab\u5408\u5e76\u5230\u4e3b\u5206\u652f\u4e2d\uff0c<br \/>\n2. \u6784\u5efa\u5de5\u5177\u68c0\u6d4b\u5e76\u8fd0\u884cnpm run build\u547d\u4ee4\u3002<br \/>\n3. \u5728docker build\u9636\u6bb5\uff0c\u590d\u5236\u2461\u751f\u6210\u7684build\u76ee\u5f55\u5e76\u542f\u52a8\u5373\u53ef\uff0c\u6211\u8ba4\u4e3a\u8fd9\u79cd\u65b9\u6cd5\u662f\u73b0\u5b9e\u53ef\u884c\u7684\u3002<\/p>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>\u4f60\u597d\u3002\u6bcf\u5230\u661f\u671f\u4e94\uff0c\u6211\u5c31\u4f1a\u60f3\u8981\u89c2\u770b\u52a8\u753b\u7535\u5f71\u3002\u6211\u662fDocker\u5927\u53d4\u3002 \u5728\u4e0a\u4e00\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u4f7f\u7528Nginx\u5c06\u524d\u7aef\u548c\u540e\u7aef [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-33067","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u5c06Spring Boot\u540e\u7aef\u548cTypeScript\u524d\u7aef\u653e\u5165\u5bb9\u5668\u4e2d - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5c06spring-boot\u540e\u7aef\u548ctypescript\u524d\u7aef\u653e\u5165\u5bb9\u5668\u4e2d\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5c06Spring Boot\u540e\u7aef\u548cTypeScript\u524d\u7aef\u653e\u5165\u5bb9\u5668\u4e2d\" \/>\n<meta property=\"og:description\" content=\"\u4f60\u597d\u3002\u6bcf\u5230\u661f\u671f\u4e94\uff0c\u6211\u5c31\u4f1a\u60f3\u8981\u89c2\u770b\u52a8\u753b\u7535\u5f71\u3002\u6211\u662fDocker\u5927\u53d4\u3002 \u5728\u4e0a\u4e00\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u4f7f\u7528Nginx\u5c06\u524d\u7aef\u548c\u540e\u7aef [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5c06spring-boot\u540e\u7aef\u548ctypescript\u524d\u7aef\u653e\u5165\u5bb9\u5668\u4e2d\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-26T07:55:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-04T09:48:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d157437434c4406bfe760\/14-0.png\" \/>\n<meta name=\"author\" content=\"\u96c5, \u609f\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u96c5, \u609f\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82\/\",\"name\":\"\u5c06Spring Boot\u540e\u7aef\u548cTypeScript\u524d\u7aef\u653e\u5165\u5bb9\u5668\u4e2d - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-10-26T07:55:36+00:00\",\"dateModified\":\"2024-05-04T09:48:21+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5c06Spring Boot\u540e\u7aef\u548cTypeScript\u524d\u7aef\u653e\u5165\u5bb9\u5668\u4e2d\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\",\"name\":\"\u96c5, \u609f\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"caption\":\"\u96c5, \u609f\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5c06Spring Boot\u540e\u7aef\u548cTypeScript\u524d\u7aef\u653e\u5165\u5bb9\u5668\u4e2d - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u5c06spring-boot\u540e\u7aef\u548ctypescript\u524d\u7aef\u653e\u5165\u5bb9\u5668\u4e2d\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5c06Spring Boot\u540e\u7aef\u548cTypeScript\u524d\u7aef\u653e\u5165\u5bb9\u5668\u4e2d","og_description":"\u4f60\u597d\u3002\u6bcf\u5230\u661f\u671f\u4e94\uff0c\u6211\u5c31\u4f1a\u60f3\u8981\u89c2\u770b\u52a8\u753b\u7535\u5f71\u3002\u6211\u662fDocker\u5927\u53d4\u3002 \u5728\u4e0a\u4e00\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u4f7f\u7528Nginx\u5c06\u524d\u7aef\u548c\u540e\u7aef [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5c06spring-boot\u540e\u7aef\u548ctypescript\u524d\u7aef\u653e\u5165\u5bb9\u5668\u4e2d\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-10-26T07:55:36+00:00","article_modified_time":"2024-05-04T09:48:21+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d157437434c4406bfe760\/14-0.png"}],"author":"\u96c5, \u609f","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u96c5, \u609f","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"3 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82\/","name":"\u5c06Spring Boot\u540e\u7aef\u548cTypeScript\u524d\u7aef\u653e\u5165\u5bb9\u5668\u4e2d - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-10-26T07:55:36+00:00","dateModified":"2024-05-04T09:48:21+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5c06Spring Boot\u540e\u7aef\u548cTypeScript\u524d\u7aef\u653e\u5165\u5bb9\u5668\u4e2d"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6","name":"\u96c5, \u609f","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","caption":"\u96c5, \u609f"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86spring-boot%e5%90%8e%e7%ab%af%e5%92%8ctypescript%e5%89%8d%e7%ab%af%e6%94%be%e5%85%a5%e5%ae%b9%e5%99%a8%e4%b8%ad%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/33067","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=33067"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/33067\/revisions"}],"predecessor-version":[{"id":99780,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/33067\/revisions\/99780"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=33067"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=33067"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=33067"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}