uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Ko'proq ko'rsatish
1 419
Obunachilar
Ma'lumot yo'q24 soatlar
-17 kunlar
+230 kunlar
Postlar arxiv
ToCode
1 419
# ืœืืŸ ื”ื•ืœื›ื™ื ื”ืงื•ืžื™ื˜ื™ื ืื—ืจื™ reset? ื˜ืจื™ืง ืžืขื ื™ื™ืŸ ืฉืœ ื’ื™ื˜ ืฉื”ืฆืœื™ื— ืœื‘ืœื‘ืœ ืื•ืชื™ ื›ืฉืจืง ื”ืชื—ืœืชื™ ืœืขื‘ื•ื“ ืขื ื”ื›ืœื™ ื”ื•ื ื”ืื•ืคืŸ ื‘ื• ื’ื™ื˜ ืžื ื”ืœ ืืช ื”ืงื•ืžื™ื˜ื™ื ืฉืœื•. ื‘ืงืฆืจื” ื‘ื’ื™ื˜ ื›ืœ ื”ืžื™ื“ืข ื ืฉืžืจ ื‘ืชื•ืจ ื’ืจืฃ ืฉืœ ืงื•ืžื™ื˜ื™ื, ื›ืืฉืจ ื›ืœ ืงื•ืžื™ื˜ "ืžืฆื‘ื™ืข" ืขืœ ื”ืงื•ืžื™ื˜ ืฉื‘ื ืœืคื ื™ื•. ื—ื•ืฅ ืžื”ืงื•ืžื™ื˜ื™ื ื™ืฉ ื’ื ื“ื‘ืจ ืฉื ืงืจื Branch-ื™ื, ืฉืืคืฉืจ ืœื—ืฉื•ื‘ ืขืœื™ื”ื ื›ืžื• ืžื“ื‘ืงื•ืช ืื• ืกื™ืžื ื™ื•ืช. ืชืจืฆื• ืชื•ื›ืœื• ืœื”ื“ื‘ื™ืง ืื•ืชื ืขืœ ื”ืงื•ืžื™ื˜ื™ื, ื•ื›ืฉื™ื™ืžืืก ืœื›ื ืชื•ื›ืœื• ืœื”ื–ื™ื– ืื•ืชื ืœืงื•ืžื™ื˜ื™ื ืื—ืจื™ื. ื—ื•ืฅ ืžื” Branch-ื™ื ื•ื” Commit-ื™ื ื™ืฉ ืขื•ื“ ืกื™ืžื ื™ื” ื—ืฉื•ื‘ื” ืฉื ืงืจืืช HEAD. ื” HEAD ื”ื•ื ืžืฆื‘ื™ืข ืœ Branch ื•ื”ื•ื ืžืกืžืŸ ืœื ื• ืžื” ื”ืงื•ืžื™ื˜ "ื”ื ื•ื›ื—ื™", ื›ืœื•ืžืจ ืžื” ื”ืงื•ืžื™ื˜ ืฉืขื›ืฉื™ื• ืื ื—ื ื• ืขื•ื‘ื“ื™ื ืขืœื™ื•. ื ืจืื” ืืช ื–ื” ืขื ืžืฉื—ืง ืขืœ ืžืื’ืจ ืคืฉื•ื˜. ื™ืฆืจืชื™ ืžืื’ืจ ืขื ืฉืœื•ืฉื” ืงื•ืžื™ื˜ื™ื ืฉื”ืœื•ื’ ืฉืœื• ื ืจืื” ื›ืš:
* 8131ef2 (HEAD -> main) third commit
* 3a40bc4 second commit
* e8006f8 first commit
ื‘ื’ืจืฃ ื™ืฉ ืฉืœื•ืฉื” ืงื•ืžื™ื˜ื™ื, ื‘ืจืื ืฅ ืื—ื“ ื‘ืฉื main ื•ื” HEAD ืฉืœื ื• ื”ื•ื ืื•ืชื• main. ืขื›ืฉื™ื• ืœืฉืืœื” ืžื”ื›ื•ืชืจืช ื•ืœื˜ืจื™ืง ืฉื™ื›ื•ืœ ื‘ืงืœื•ืช ืœื”ืœื—ื™ืฅ ื—ื‘ืจื™ื ื‘ืžืกื™ืžื•ืช. ื ืคืขื™ืœ:
$ git reset --hard HEAD~
ื•ืื– ื ืกืชื›ืœ ื‘ืœื•ื’:
3a40bc4 (HEAD -> main) second commit
e8006f8 first commit
ื‘ื•ื! ืœืืŸ ื ืขืœื ื”ืงื•ืžื™ื˜ ื”ืฉืœื™ืฉื™? ื”ืชืฉื•ื‘ื” ื”ืงืฆืจื” ื”ื™ื ืฉื”ื•ื ืœื ื ืขืœื ืœืฉื•ื ืžืงื•ื. ื‘ืกืš ื”ื›ืœ ื”ื–ื–ืชื™ ืืช main ื•ืื™ืชื• ืืช HEAD ื•ืœื›ืŸ ื›ืฉืื ื™ ืžืคืขื™ืœ ืขื›ืฉื™ื• git log ืื ื™ ืžืชื—ื™ืœ ืืช ื”ืกืคื™ืจื” ืžืžืงื•ื ืื—ืจ - ืžื”ืงื•ืžื™ื˜ ื”ืฉื ื™. ืœืฆืขืจื ื• ืงื•ืžื™ื˜ื™ื ืœื ืฉื•ืžืจื™ื ืžืฆื‘ื™ืข ืœืงื•ืžื™ื˜ ืฉื‘ื ืื—ืจื™ื”ื (ื”ื’ืจืฃ ืžื›ื•ื•ืŸ ื”ืคื•ืš, ื›ืœื•ืžืจ ื›ืœ ืงื•ืžื™ื˜ ื™ื•ื“ืข ืจืง ืžื™ ื‘ื ืœืคื ื™ื•) - ื•ื–ื” ืื•ืžืจ ืฉืื ื™ ื‘ื ืงื•ื“ื” ื‘ื—ื™ื™ื ื‘ื” ื”ืงื•ืžื™ื˜ ื”ื ื•ื›ื—ื™ ืคืฉื•ื˜ ืœื ื™ื•ื“ืข ืœืกืคืจ ืœื™ ืื™ืš ืœื”ื’ื™ืข ืœืงื•ืžื™ื˜ ื”ืขื“ื›ื ื™ ื‘ื™ื•ืชืจ. ืื‘ืœ ื–ื” ืœื ืื•ืžืจ ืฉืื•ืชื• ืงื•ืžื™ื˜ ื ืขืœื ืื• ื ืžื—ืง. ืื ืืชื ื–ื•ื›ืจื™ื ืืช ืžื–ื”ื” ื”ืงื•ืžื™ื˜ ืืชื ื™ื›ื•ืœื™ื ื‘ืงืœื•ืช ืœื—ื–ื•ืจ ืืœื™ื• ืขื:
$ git reset --hard 8131ef2
ืืคื™ืœื• ืื ืืชื ืœื ื–ื•ื›ืจื™ื ืืช ื”ืžื–ื”ื” ืืชื ื™ื›ื•ืœื™ื ื‘ืงืœื•ืช ืœื‘ื“ื•ืง ืžื” ื”ื•ื ื”ื™ื” ืขื:
$ git reflog

3a40bc4 (HEAD -> main) HEAD@{0}: reset: moving to HEAD~
8131ef2 HEAD@{1}: reset: moving to 8131ef2
3a40bc4 (HEAD -> main) HEAD@{2}: reset: moving to main
3a40bc4 (HEAD -> main) HEAD@{3}: reset: moving to HEAD~
8131ef2 HEAD@{4}: commit: third commit
3a40bc4 (HEAD -> main) HEAD@{5}: commit: second commit
e8006f8 HEAD@{6}: commit (initial): first commit
ืฉืฉื•ืžืจ ื™ื•ืžืŸ ืฉืœ ื›ืœ ื”ืคืขื•ืœื•ืช ืฉื‘ื•ืฆืขื• ืืฆืœื›ื ื‘ืžืื’ืจ. ืžืขื ื™ื™ืŸ ืœืฉื™ื ืœื‘ ืฉื”ื™ื•ืžืŸ ื”ื•ื ืœื ื”ืงื•ืžื™ื˜ื™ื. ืืคืฉืจ ืœืžื—ื•ืง ืžื”ื™ื•ืžืŸ ืจืฉื•ืžื•ืช ืฉืœ ืงื•ืžื™ื˜ื™ื ืฉืื™ ืืคืฉืจ ืœื”ื’ื™ืข ืืœื™ื”ื ืขื:
$ git reflog expire --expire-unreachable=now --all
ื•ื–ื” ื™ืžื—ืง ืžื”ื™ื•ืžืŸ ื›ืœ ื”ืชื™ื—ืกื•ืช ืœืงื•ืžื™ื˜ 8131ef2, ืžื” ืฉื™ื”ืคื•ืš ืืช ื”ื˜ืจื™ืง ืœื”ืจื‘ื” ื™ื•ืชืจ ืžืคื—ื™ื“ ื›ื™ื•ื•ืŸ ืฉืขื›ืฉื™ื• ื™ื”ื™ื” ื”ืจื‘ื” ื™ื•ืชืจ ืงืฉื” ืœื”ื’ื™ืข ืœืื•ืชื• ื”ืงื•ืžื™ื˜ (ืื‘ืœ ืขื“ื™ื™ืŸ ืืคืฉืจื™, ืื ื™ื•ื“ืขื™ื ืืช ื”ืžื–ื”ื” ืื• ืื ื™ืฉ ืœื›ื ืžืกืคื™ืง ืกื‘ืœื ื•ืช ืœื—ื˜ื˜ ื‘ืชื™ืงื™ื™ืช .git ื›ื“ื™ ืœืžืฆื•ื ืืช ื”ืžื–ื”ื”). ืžื—ื™ืงื” ืžื•ื—ืœื˜ืช ืฉืœ ืื•ืชื• ืงื•ืžื™ื˜ ืืคืฉืจื™ืช ืขื ื”ืคืงื•ื“ื”:
$ git gc --prune=now
ืจืง ืื—ืจื™ ืฉืžื—ืงืชื ืืช ื”ืงื•ืžื™ื˜ ืžื” reflog ื›ื“ื™ ืฉื‘ืืžืช ืื™ ืืคืฉืจ ื™ื”ื™ื” ืœื”ื’ื™ืข ืืœื™ื• ืื• ืœื›ืœ ืงื•ืžื™ื˜ ืื—ืจ ืฉืžืฆื‘ื™ืข ืขืœื™ื•. ืื‘ืœ ืžื”ืœืš ื›ื–ื” ืขืœื•ืœ ืœืฆืืช ืžืชื—ื•ื ื”ื”ื•ืžื•ืจ ื”ื‘ืจื™ื ื•ืœื’ืจื•ื ืœื—ื‘ืจื™ื ืฉืœื›ื ืœื”ื™ื‘ื”ืœ ื‘ืืžืช.

ToCode
1 419
# ื”ืขืจื›ื•ืช ื–ืžื ื™ื (ื˜ื™ื™ืง 712) ืื™ืคื” ืจื•ืฉืžื™ื ืืช ื›ืœ ื”ืคืขืžื™ื ืฉื›ืชื‘ืชื™ ื•ืžื—ืงืชื™ ืืช ื”ืงื•ื“ ืขื“ ืฉื”ื•ื ืขื‘ื“? ื•ื›ืžื” ื–ืžืŸ ืขื‘ื•ื“ื” ื–ื” ืœืงื—? ื”ืขืจื›ืช ื–ืžื ื™ื ื”ื™ื ืื™ืฉื™ืช ื•ืชืœื•ื™ื” ื‘ื ืงื•ื“ื” ื‘ื–ืžืŸ, ื•ื–ื” ืžื‘ืœื‘ืœ. ืœืจื•ื‘ ื”ื‘ืขื™ื•ืช ืฉืื ื—ื ื• ืžืชืžื•ื“ื“ื™ื ืื™ืชืŸ ื‘ืชื•ืจ ืžืชื›ื ืชื™ื ื™ืฉ ืคื™ืชืจื•ืŸ ืคืฉื•ื˜, ื•ื›ืชื™ื‘ื” ืฉืœ ืื•ืชื• ืคื™ืชืจื•ืŸ ืคืฉื•ื˜ ืœื•ืงื—ืช ื’ื’ ื›ืžื” ืฉืขื•ืช. ืขื™ืงืจ ื”ื–ืžืŸ ืฉืื ื—ื ื• ืžื‘ืœื™ื ืขืœ ื‘ืขื™ื” ื”ื•ื ืœื ื‘ื›ืชื™ื‘ืช ืื•ืชื• ืคื™ืชืจื•ืŸ ืคืฉื•ื˜ ืืœื ื‘ื”ื’ืขื” ืืœื™ื• - ื•ื–ื” ื™ื›ื•ืœ ืœืงื—ืช ื’ื ืฉื‘ื•ืขื•ืช ืื• ื—ื•ื“ืฉื™ื. ื”ื—ืœืง ื”ืžื‘ืœื‘ืœ ืžื’ื™ืข ื›ืฉืžืกืชื›ืœื™ื ืขืœ ื”ืงื•ื“ ืขืฆืžื• ื•ื›ืœื•ื ืœื ืžืฉืชืงืฃ ืฉื. ืื ื™ืฉื‘ืชื™ ืฉื‘ื•ืขื™ื™ื ืขืœ ื‘ืขื™ื”, ื•ื›ืœ ื™ื•ื ื ื™ืกื™ืชื™ ืœืคืชื•ืจ ืื•ืชื” ื‘ื“ืจืš ืงืฆืช ืฉื•ื ื” ืขื“ ืฉืื—ืจื™ ืฉื‘ื•ืขื™ื™ื ื”ื’ืขืชื™ ืœืคื™ืชืจื•ืŸ ื˜ื•ื‘, ืื– ืžื‘ื—ื™ื ืช ื”ืงื•ื“ ื”ืฉื‘ื•ืขื™ื™ื ื”ืืœื” ื”ืœื›ื• ืœืคื—. ืžืชื›ื ืช ืื—ืจ ื™ื•ืชืจ ื—ื›ื ืžืžื ื™, ืฉื”ื™ื” ืคื•ืชืจ ืืช ืื•ืชื” ื‘ืขื™ื” ื›ืžื• ืฉืฆืจื™ืš ื‘ื™ื•ื ื”ืจืืฉื•ืŸ ื”ื™ื” ืžื™ื™ืฆืจ ืืช ืื•ืชื• ืงื•ื“ ื‘ื“ื™ื•ืง ืฉืื ื™ ื›ืชื‘ืชื™, ืจืง ื”ืจื‘ื” ื™ื•ืชืจ ืžื”ืจ. ืคื™ืชืจื•ื ื•ืช? ืื™ืŸ ืžืžืฉ. ื•ื–ืืช ืœื ื‘ืขื™ื” ืจืง ืฉืœื ื•. ื”ืฉื‘ื•ืขื™ื™ื ื”ืืœื” ื”ื ื—ืœืง ืžื”ื™ื•ืคื™ ื‘ืœื‘ื ื•ืช ื“ื‘ืจื™ื ื—ื“ืฉื™ื ืฉืขื“ื™ื™ืŸ ืœื ื‘ื ื™ืช ื‘ืขื‘ืจ, ื•ืžื™ ืฉื™ื—ืคืฉ "ืœื”ืขืœื™ื" ืื•ืชื ื™ื’ืœื” ืฉื”ื•ื ื‘ืกืš ื”ื›ืœ ืคื•ืชืจ ืืช ืื•ืชืŸ ื‘ืขื™ื•ืช ืฉื”ื•ื ื›ื‘ืจ ื™ื•ื“ืข ืœืคืชื•ืจ ืฉื•ื‘ ื•ืฉื•ื‘.

ToCode
1 419
ืœืžืจื•ืช ืงืœื•ืช ื”ื”ืชืงื ื” ื›ืฉื”ืกืจื‘ื™ืกื™ื ืžื›ื™ืœื™ื ื˜ื™ืคื•ืกื™ื ืฉื•ื ื™ื, ืžืžืฉื—ืง ืงืฆืจ ืขื ื‘ืจืืžื‘ืœ ืœื ื”ื‘ื ืชื™ ืขื“ ื”ืกื•ืฃ ืื™ืš ื”ื ืžื˜ืคืœื™ื ื‘ืกืจื‘ื™ืกื™ื ืฉื—ื•ืœืงื™ื ื˜ื™ืคื•ืกื™ื ื•ื“ื•ื’ืžืื•ืช ืฉื ื™ืกื™ืชื™ ืœื›ืชื•ื‘ ืฉื”ื™ื• ืงืฆืช ื™ื•ืชืจ ืžืกื•ื‘ื›ื•ืช ืžืžื” ืฉื”ื ื”ืจืื• ื‘ืชื™ืขื•ื“ ืœื ืขื‘ื“ื• ืœื™. ืœื ื‘ื˜ื•ื— ืื ื”ื‘ืขื™ื” ืืฆืœื™ ืื• ื‘ื‘ืจืืžื‘ืœ, ื•ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื‘ื”ืžืฉืš ื›ืŸ ืืฆืœื™ื— ืœื”ื‘ื™ืŸ ืืช ืžื’ื ื ื•ืŸ ืฉื™ืชื•ืฃ ื”ื˜ื™ืคื•ืกื™ื ืฉืœื”ื. ื‘ื™ื ืชื™ื™ื ืžื” ืฉืื”ื‘ืชื™ ื‘ืคืจื•ื™ืงื˜: 1. ื–ื™ื”ื•ื™ ืžื”ื™ืจ ืฉืœ ื‘ืขื™ื•ืช - ื›ืœ ืคืขื ืฉื”ื™ืชื” ืœื™ ื˜ืขื•ืช ื‘ืจืืžื‘ืœ ื”ืฆื™ื’ ื”ื•ื“ืขื” ื“ื™ ืื™ื ืคื•ืจืžื˜ื™ื‘ื™ืช ืœืงื•ื ืกื•ืœ 2. ื–ื™ื”ื•ื™ ืžื”ื™ืจ ื•ืื•ื˜ื•ืžื˜ื™ ืฉืœ ื›ืœ ื”ืกืจื‘ื™ืกื™ื ื•ื‘ื ื™ื™ืช ืกื›ื™ืžื” ืžื—ื•ื‘ืจืช ืื•ื ืœื™ื™ืŸ, ื›ื•ืœืœ ื”ืžืฉืš ืžืขืงื‘ ืื—ืจื™ ื”ืกืจื‘ื™ืกื™ื ื•ืขื“ื›ื•ืŸ ื”ืกื›ื™ืžื” ืื ืžืฉื”ื• ืžืฉืชื ื” ื‘ืกืจื‘ื™ืกื™ื ื”ืคื ื™ืžื™ื™ื. 3. ื”ืชืงื ื” ืคืฉื•ื˜ื” ื“ืจืš ื“ื•ืงืจ (ื‘ื ื™ืชื™ ืื™ืžื’' ื‘ืขืฆืžื™ - ื”ืื™ืžื’' ืฉืœื”ื ืœื ืขื‘ื“). 4. ืชืžื™ื›ื” ืžื•ื‘ื ื™ืช ื‘ืื™ืžื•ืช ื–ื”ื•ืช ื“ืจืš JWT ืžื” ืฉืœื ืื”ื‘ืชื™ ื‘ืคืจื•ื™ืงื˜ ื”ื™ื”: 1. ืื™ืŸ ืžืกืคื™ืง ื“ื•ื’ืžืื•ืช ื•ื’ื ื”ืชื™ืขื•ื“ ืœื ืžืงื™ืฃ ื‘ืžื™ื•ื—ื“. 2. ื” Docker Image ืฉื”ื ืžืกืคืงื™ื ืœื ืขื‘ื“. 3. ื—ืœืง ืžื”ืืคืฉืจื•ื™ื•ืช ื‘ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ืฉื›ืŸ ื”ื•ืคื™ืขื• ื‘ืชื™ืขื•ื“ ืœื ืขื‘ื“ื•. ืœื ื‘ื˜ื•ื— ืื ื”ื“ื‘ืจื™ื ืฉืœื ืขื‘ื“ื• ื”ื™ื• ื‘ื’ืœืœ ืฉืื ื™ ืœื ื™ื•ื“ืข ืœื”ืฉืชืžืฉ ื‘ืคืจื•ื™ืงื˜ ืขื“ื™ื™ืŸ ืื• ื‘ื’ืœืœ ืฉื‘ืืžืช ื™ืฉ ืœื”ื ืขื“ื™ื™ืŸ ืœื ืžืขื˜ ื‘ืื’ื™ื. ื‘ื›ืœ ืžืงืจื” ื”ืคืจื•ื™ืงื˜ ื ืจืื” ืฆืขื™ืจ ื•ืžื‘ื˜ื™ื—. ืœื ื—ื•ืฉื‘ ืฉื”ื™ื” ืœื™ ืื•ืžืฅ ืœื”ืฉืชืžืฉ ื‘ื• ื‘ืคืจื•ื“ืงืฉืŸ ื‘ืžืงื•ื ืืคื•ืœื• ืื‘ืœ ื‘ื•ื•ื“ืื•ืช ืื—ื–ื•ืจ ืขื•ื“ ื›ืžื” ื—ื•ื“ืฉื™ื ืœื‘ื“ื•ืง ืžื” ืžืฆื‘ื. ื–ื” ื”ืœื™ื ืง ืœื’ื™ื˜ื”ืื‘ ืฉืœ ื‘ืจืืžื‘ืœ: https://github.com/movio/bramble ื•ื–ื” ืคืจื•ื™ืงื˜ ื”ื“ื•ื’ืžื” ืฉืœื™ ืฉืžืฉืชืžืฉ ื‘ื• ืขื ืฉื ื™ ืกืจื‘ื™ืกื™ื ื”ื›ืชื•ื‘ื™ื ื‘ Node.JS: https://github.com/ynonp/playing-with-bramble

ToCode
1 419
# ื—ื™ื‘ื•ืจ ืžืกืคืจ ืฉืจืชื™ GraphQL ืขื Bramble ืœืคื™ ื”ืืชืจ ืฉืœื”ื, ื‘ืจืืžื‘ืœ ื”ื Production Ready GraphQL Federation. ืžืื—ืจ ื•ืื ื™ ืชืžื™ื“ ืฉืžื— ืœื‘ื“ื•ืง ื—ืœื•ืคื•ืช ืคืฉื•ื˜ื•ืช ื™ื•ืชืจ ืœ Apollo ื”ืœื›ืชื™ ืœื‘ื ื•ืช ืคืจื•ื™ืงื˜ ื“ื•ื’ืžื” ืงื˜ืŸ ืขื ื‘ืจืืžื‘ืœ. ืงื•ื“ ื”ืคืจื•ื™ืงื˜ ื›ืืŸ: https://github.com/ynonp/playing-with-bramble ื‘ืคื•ืกื˜ ืืกืคืจ ืื™ืš ื‘ืจืžื‘ืœ ืขื•ื‘ื“ ื•ืžืชื™ ืฉื•ื•ื” ืœืฉืงื•ืœ ืื•ืชื•. ## ืžื” ื–ื” ืื•ืžืจ GraphQL Federation ื ื ื™ื— ืฉื™ืฉ ืœื›ื ืžืกืคืจ ืกืจื‘ื™ืกื™ื ืฉื›ืœ ืื—ื“ ืžื”ื ืขื•ื‘ื“ ื‘ GraphQL, ื•ืืชื ืจื•ืฆื™ื ืœื—ืฉื•ืฃ ืจืง ืžืžืฉืง ืื—ื“ ืœืืคืœื™ืงืฆื™ื™ืช ื” Front End ืฉื“ืจื›ื• ื”ืืคืœื™ืงืฆื™ื” ืชื•ื›ืœ ืœืžืฉื•ืš ืžื™ื“ืข ืžื›ืœ ื”ืกืจื‘ื™ืกื™ื. ื‘ืžืฆื‘ ื›ื–ื” ืืชื ืชืจืฆื• ืœื‘ื ื•ืช ืกืจื‘ื™ืก ืื—ื“ ืฉื ืงืจื GraphQL Gateway ืฉื™ืฉืชืžืฉ ื‘ืกื›ื™ืžื” ืฉืชื”ื™ื” ืกื•ื’-ืฉืœ-ื—ื™ื‘ื•ืจ ืฉืœ ื›ืœ ื”ืกื›ื™ืžื•ืช ืžื›ืœ ื”ืกืจื‘ื™ืกื™ื, ื•ื›ืœ ืคืขื ืฉื ื‘ืงืฉ ืžืžื ื• ืžื™ื“ืข ื”ื•ื ืคืฉื•ื˜ ื™ืคื ื” ืœืกืจื‘ื™ืก ื”ืžืชืื™ื ืœืงื‘ืœ ืžืžื ื• ืืช ื”ืžื™ื“ืข. ืฉืชื™ ื”ื“ืจื›ื™ื ื”ืžืจื›ื–ื™ื•ืช ืœื—ื‘ืจ ืกื›ื™ืžื•ืช ื ืงืจืื•ืช Schema stitching ื• Federation ื›ืฉื”ื”ื‘ื“ืœื™ื ื”ืžืจื›ื–ื™ื™ื ื ื•ื’ืขื™ื ืœืื•ืคืŸ ืฉื‘ื• ืื ื—ื ื• ืžืชื™ื—ืกื™ื ืœื˜ื™ืคื•ืกื™ื ื”ืžืฉื•ืชืคื™ื ื‘ื™ืŸ ืกืจื‘ื™ืกื™ื, ื•ืœืื™ืš ืžืžื–ื’ื™ื ืืช ื”ืกื›ื™ืžื•ืช. ืื•ืžื ื ื‘ืจืžื‘ืœ ื”ื ืคื™ืชืจื•ืŸ ืžืกื•ื’ Federation ืื‘ืœ ื‘ืคืจื•ื™ืงื˜ ื”ื“ื•ื’ืžื” ืฉื›ืชื‘ืชื™ ืœื ื”ื’ืขืชื™ ืœื—ืœืงื™ื ื”ืžืขื ื™ื™ื ื™ื ืฉืœ ื” Federation ืฉืœ ืžื™ื–ื•ื’ ื˜ื™ืคื•ืกื™ื ื•ืœื›ืŸ ืœืคื—ื•ืช ืžื‘ื—ื™ื ืช ืžื” ืฉื ืจืื” ื‘ืคื•ืกื˜ ื”ื ื”ื™ื• ื™ื›ื•ืœื™ื ื‘ืื•ืชื” ืžื™ื“ืข ืœืงืจื•ื ืœื–ื” Schema Stiching. ืžื” ืฉื—ืฉื•ื‘ ืœื”ื‘ื™ืŸ ื›ืืŸ ื–ื” ืฉ Bramble ื™ื”ื™ื” ืกื•ื’ ืฉืœ Gateway ืื•ื˜ื•ืžื˜ื™ ืฉืคืฉื•ื˜ ืžืงื‘ืœ ืืช ื”ืกืจื‘ื™ืกื™ื ื•ื™ื•ื“ืข ืœื”ืขื‘ื™ืจ ื‘ืงืฉื•ืช ื•ืœื—ื‘ืจ ืžื™ื“ืข ืžืฉื ื™ื”ื. ื•ืžื” ืฉืื”ื‘ืชื™ ื‘ื• ื–ื” ืฉื”ืกื˜ืืค ื”ื™ื” ืžืื•ื“ ืžืื•ื“ ืคืฉื•ื˜. ## ื”ืงืžืช ืฉืจืช Bramble ื›ืœ ืžื” ืฉืฆืจื™ืš ื‘ืฉื‘ื™ืœ ืœื”ืจื™ื ืฉืจืช Bramble ื”ื•ื ืœื”ืจื™ืฅ ืืช ื”ื‘ื™ื ืืจื™ (ื›ืชื•ื‘ ื‘ go) ื•ืœื”ืขื‘ื™ืจ ืœื• ืงื•ื‘ืฅ ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ืฉืื•ืžืจ ืื™ืคื” ื”ืกืจื‘ื™ืกื™ื ืฉื”ื•ื ืฆืจื™ืš ืœื—ื‘ืจ. ืงื•ื‘ืฅ ื”ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ืฉืื ื™ ื›ืชื‘ืชื™ ื ืจืื” ื›ืš:
{
  "services": [
    "http://tasks-server:3000/graphql",
    "http://fortune:3000/graphql"
  ],
  "plugins": [
    {
      "name": "playground"
    }
  ]
}
ืืช ื”ืกื›ื™ืžื•ืช ื‘ืจืืžื‘ืœ ืžืงื‘ืœ ืžื”ืกืจื‘ื™ืกื™ื ืขืฆืžื ื•ืœื›ืŸ ื›ืœ ืกืจื‘ื™ืก ืฉืฆืจื™ืš ืœืฉื‘ืช ืžืื—ื•ืจื™ ื‘ืจืืžื‘ืœ ื ื“ืจืฉ ืœื”ื•ืกื™ืฃ ืœ Query ืฉืœื• ืฉืื™ืœืชื” ืฉืžื—ื–ื™ืจื” ื˜ื™ืคื•ืก ื‘ืฉื Service. ื‘ืคืจื•ื™ืงื˜ ื”ื“ื•ื’ืžื” ื™ืฉ ืœื™ ืฉื ื™ ืกืจื‘ื™ืกื™ื, ืื—ื“ ื ืงืจื fortune ืฉืžื—ื–ื™ืจ ืืช ื”ืชื•ืฆืื” ืฉืœ ืคืงื•ื“ืช fortune ื•ื”ืฉื ื™ ื ืงืจื tasks-server ืฉืžื—ื–ื™ืจ ืจืฉื™ืžืช ืžืฉื™ืžื•ืช. ืงื•ื‘ืฅ ื”ืกื›ื™ืžื” ืžืชื•ืš ืกืจื‘ื™ืก fortune ืฉื”ื•ื ื”ืงื˜ืŸ ื™ื•ืชืจ ื ืจืื” ื›ืš:
type Query {
  fortune: String!
  service: Service!
}

type Service {
  name: String! # unique name for the service
  version: String! # any string
  schema: String! # the full schema for the service
}
ื•ื”ื—ืœืง ื”ืจืœื•ื•ื ื˜ื™ ื‘ืกื›ื™ืžื” ืžืกืจื‘ื™ืก ื”ืžืฉื™ืžื•ืช ื ืจืื” ื›ืš:
type Query {
  tasks(done: Boolean): [Task]
  task(id: String): Task
  service: Service!
}

type Service {
  name: String! # unique name for the service
  version: String! # any string
  schema: String! # the full schema for the service
}

ื’ื ื” Resolver ืขื‘ื•ืจ Service ื”ื•ื ื“ื™ ื”ืขืชืง-ื”ื“ื‘ืง ืžื”ื“ื•ื’ืžืื•ืช ืฉืœื”ื. ื”ื ื” ืื—ื“ ืฉื›ืชื‘ืชื™ ืœื“ื•ื’ืžื” ื‘ืกืจื‘ื™ืก ื”ืžืฉื™ืžื•ืช:
service(_obj, _args, _context, info) {
    return {
        name: 'Tasks',
        version: '1.0',
        schema: require('./schema.graphql'),
    }
},
ื•ื‘ืกืš ื”ื›ืœ ื–ื” ื›ืœ ืžื” ืฉืฆืจื™ืš ื‘ืฉื‘ื™ืœ ืฉื‘ืจืืžื‘ืœ ื™ืขื‘ื•ื“. ## ืื™ืš ื‘ืจืืžื‘ืœ ืขื•ื‘ื“ ื‘ืขืœื™ื™ืช ื”ืคืจื•ื™ืงื˜ ื‘ืจืžืื‘ืœ ืžืชื—ื‘ืจ ืœืกืจื‘ื™ืกื™ื ืฉื”ืขื‘ืจื ื• ืœื• ื‘ืงื•ื‘ืฅ ื”ืงื•ื ืคื™ื’ื•ืจืฆื™ื”, ืœื•ืงื— ืืช ื”ืกื›ื™ืžื•ืช ืžื”ื, ื‘ื•ื ื” ืื•ื˜ื•ืžื˜ื™ืช ืกื›ื™ืžื” ืžืฉื•ืชืคืช ื•ืžืืคืฉืจ ืœื”ืชื—ื™ืœ ืœื”ืจื™ืฅ ืฉืื™ืœืชื•ืช. ืื ืืชื ืžื•ืจื™ื“ื™ื ืืช ืคืจื•ื™ืงื˜ ื”ื“ื•ื’ืžื” ื•ืจื•ืฆื™ื ืœื ืกื•ืช ืืช ื–ื” ื”ืคืขื™ืœื• ืžื”ืชื™ืงื™ื” ื”ืจืืฉื™ืช ืฉืœื•:
$ docker-compose up
ื•ืื—ืจื™ ื–ื” ื›ื ืกื• ื‘ื“ืคื“ืคืŸ ืœ localhost:8082/playground. ืื—ืจื™ ื–ื” ืชื•ื›ืœื• ืœื”ืจื™ืฅ ืฉืื™ืœืชื” ื›ืžื• ื–ื•:
query a{
  tasks {
    text
  }
}
ื•ืœืงื‘ืœ ืืช ืจืฉื™ืžืช ื”ืžืฉื™ืžื•ืช ืื• ืฉืื™ืœืชื” ื›ื–ื•:
query b{
  fortune
}
ื›ื“ื™ ืœืงื‘ืœ fortune ืืงืจืื™. ื–ื” ืžื“ืœื™ืง ื›ื™ ืฉืชื™ ื”ืฉืื™ืœืชื•ืช ื”ื•ืœื›ื•ืช ืœืื•ืชื• Gateway ื•ื”ื•ื ื›ื‘ืจ ื™ื•ื“ืข ืœืฉืœื•ื— ืืช ื”ืฉืื™ืœืชื” ื”ืจืืฉื•ื ื” ืœืกืจื‘ื™ืก ื”ืžืฉื™ืžื•ืช ื•ืืช ื”ืฉื ื™ื” ืœืกืจื‘ื™ืก ื” fortune. ื‘ืื•ืชื• Playground ืืคืฉืจ ืœืจืื•ืช ื’ื ืืช ื”ืกื›ื™ืžื” ื”ืžื—ื•ื‘ืจืช ื•ื‘ืœื•ืง Query ืฉืœื” ื ืจืื” ื›ืš:
type Query {
  tasks(done: Boolean): [Task]
  task(id: String): Task
  fortune: String!
}
ื›ืœื•ืžืจ ื”ื•ื ื—ื™ื‘ื•ืจ ืฉืœ ื” Query ืžืฉื ื™ ื”ืกืจื‘ื™ืกื™ื. ืืช ื›ืœ ื–ื” ื‘ืจืืžื‘ืœ ื”ืฆืœื™ื— ืœืขืฉื•ืช ืื•ื˜ื•ืžื˜ื™ืช. ## ืžื” ืขื“ื™ื™ืŸ ืœื ื”ืฆืœื—ืชื™ ืœืขืฉื•ืช

ToCode
1 419
# ืื™ื ื“ืืกื˜ืจื™ ืกื˜ื ื“ืจื˜ ื”ื›ืœื™ ืฉื ื—ืฉื‘ Industry Standard ื”ื•ื ืœื ื‘ื”ื›ืจื— ื™ื•ืชืจ ื˜ื•ื‘, ืœื ื‘ื”ื›ืจื— ื™ื•ืชืจ ืคืฉื•ื˜ ื•ืœื ื‘ื”ื›ืจื— ื™ื•ืชืจ ื™ืขื™ืœ ืžื”ืžืชื—ืจื™ื. ื”ื™ืชืจื•ื ื•ืช ื”ื ืื—ืจื™ื: 1. ืžื™ืฉื”ื• ืฉืžืฉืชืžืฉ ื‘ื• ื›ื ืจืื” ื›ื‘ืจ ื ืชืงืœ ื‘ืจื•ื‘ ื”ื‘ืขื™ื•ืช ืฉืืชื ืฆืคื•ื™ื™ื ืœื”ื™ืชืงืœ ื‘ื”ืŸ. 2. ื™ืฉ ืžื ื’ื ื•ืŸ ืžื•ื‘ื ื” ืœื”ืชืžื•ื“ื“ ืขื ื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ื”ืžื•ื–ืจื” ืฉืœ ื”ืžืขืจื›ืช ืฉืœื›ื. 3. ื™ืฉ ืชื™ืขื•ื“ ืœื ืจืข ื‘ื›ืœืœ, ื•ื“ื™ ื”ืจื‘ื” ืชืฉื•ื‘ื•ืช ื‘ Stack Overflow ื•ื‘ Github Issues ืฉืœ ื”ืื ืฉื™ื ืฉืœื ื”ืฆืœื™ื—ื• ืœืžืฆื•ื ืืช ืžื” ืฉืžื—ืคืฉื™ื ื‘ืชื™ืขื•ื“. ืื‘ืœ ืœ Industry Standard ื™ืฉ ื’ื ื—ืกืจื•ื ื•ืช. ื‘ื’ืœืœ ืฉื”ื•ื ืžืชืื™ื ืœื›ืœ ื”ืชืขืฉื™ื”, ืจื•ื‘ ื”ื–ืžืŸ ื”ื•ื ื™ื”ื™ื” ื™ื•ืชืจ ืžืกื•ื‘ืš ืžืžื” ืฉืื ื™ ืฆืจื™ืš ืœืคืจื•ื™ืงื˜ ืฉืœื™ (ื‘ืžื™ื•ื—ื“ ื‘ืชื—ื™ืœืช ื”ื“ืจืš). ื™ื•ืชืจ ืžืกื•ื‘ืš ื–ื” ืื•ืžืจ: 1. ืขืงื•ืžืช ืœื™ืžื•ื“ ื™ื•ืชืจ ืงืฉื”, ื›ื™ ืฆืจื™ืš ืœืงืจื•ื ื”ืจื‘ื” ื™ื•ืชืจ ืชื™ืขื•ื“ ื•ืœื”ื‘ื™ืŸ ืื™ื–ื” ืžื”ื™ื›ื•ืœื•ืช ืจืœื•ื•ื ื˜ื™ื•ืช ืœืžืขืจื›ืช ืฉืœื™. 2. ื‘ื™ืฆื•ืขื™ ื‘ืจื™ืจืช ืžื—ื“ืœ ืคื—ื•ืช ื˜ื•ื‘ื™ื. ื ื›ื•ืŸ ืฉื›ืžืขื˜ ืชืžื™ื“ ืชื”ื™ื” ืืคืฉืจื•ืช ืœืฉื™ืคื•ืจ ื‘ื™ืฆื•ืขื™ื ื•ื’ื ื™ื”ื™ื• ืื™ื ืกื•ืฃ ืžืืžืจื™ื ืื™ืš ืœืฉืคืจ ื‘ื™ืฆื•ืขื™ื, ืื‘ืœ ื‘ืจื™ืจื•ืช ื”ืžื—ื“ืœ ื—ื™ื™ื‘ื•ืช ืœื›ืœื•ืœ ืคืฉืจื•ืช ืฉื™ืชืื™ืžื• ืœื›ื•ืœื. ื›ืฉืžื™ืฉื”ื• ืžืกืคืจ ืœื™ ืขืœ Bundler ื™ื•ืชืจ ื˜ื•ื‘ ืž Webpack, ืขืœ Web Framework ื™ื•ืชืจ ื˜ื•ื‘ ืž Express, ืขืœ GraphQL Federation ื™ื•ืชืจ ื˜ื•ื‘ ืž Apollo ืื• ืขืœ Orchestrator ื™ื•ืชืจ ื˜ื•ื‘ ืžืงื•ื‘ืจื ื˜ืก ืื ื™ ืœื ืžืชื•ื•ื›ื—. ื›ืœ ืขื•ื“ ืื ื™ ืฉื•ืžืจ ืœืขืฆืžื™ ืืช ื”ืืคืฉืจื•ืช ืœื”ื—ืœื™ืฃ ื‘ืขืชื™ื“, ืื ื™ ืืคื™ืœื• ืฉืžื— ืœืชืช ืœื›ืœื™ ื”ื—ื“ืฉ ืฆ'ืื ืก.

ToCode
1 419
# ื˜ื™ืค JavaScript: ื˜ื™ืคื•ืœ ื‘ืื•ื‘ื™ืงื˜ ืื• Promise ืžืื•ืชื” ืคื•ื ืงืฆื™ื” ื”ื˜ืจื™ืง ื”ื‘ื ืœื ืžืกื•ื‘ืš ืœืžื™ืžื•ืฉ ืื‘ืœ ื™ื›ื•ืœ ืœื—ืกื•ืš ืœื›ื ืงืฆืช if-ื™ื ื›ืฉืืชื ื–ื•ื›ืจื™ื ืœื”ืฉืชืžืฉ ื‘ื• ื‘ืžืงื•ืžื•ืช ื”ื ื›ื•ื ื™ื. ื‘ื•ืื• ื ื ื™ื— ืฉื™ืฉ ืœื™ ืคื•ื ืงืฆื™ื” ืฉืฆืจื™ื›ื” ืœื”ืคื•ืš ืืช ื”ืื•ืช ื”ืจืืฉื•ื ื” ื‘ื›ืœ ืžื™ืœื” ืœืื•ืชื™ื•ืช ื’ื“ื•ืœื•ืช, ืžืฉื”ื• ื›ื–ื”:
function capitalize(item) {
  return item.replace(/\b(\w)/g, c => c.toUpperCase());
}
ื•ืคืชืื•ื ืžื’ื™ืข ื—ื‘ืจ ืฉืจื•ืฆื” ืœื”ืฉืชืžืฉ ื‘ื” ื‘ืžืงื•ื ื ื•ืกืฃ ื‘ืžืขืจื›ืช - ืื‘ืœ ืื™ืŸ ืœื• ื‘ื™ื“ ืžื—ืจื•ื–ืช ื˜ืงืกื˜ ืืœื Promise ืœืžื—ืจื•ื–ืช. ื”ืื™ื ื˜ื•ืื™ืฆื™ื” ื”ืจืืฉื•ื ื” ื”ื™ื ืœื”ืชืขืฆื‘ืŸ ืขืœ ื”ื—ื‘ืจ ืื• ืœื‘ืงืฉ ืžืžื ื• ืœื”ื•ืกื™ืฃ await ื‘ื›ืœ ืžืงื•ื, ืื‘ืœ ืื ื ืขืฆื•ืจ ืœื—ืฉื•ื‘ ืขืœ ื–ื” ืœืจื’ืข ื ืจืื” ืฉื™ืฉ ืคื™ืชืจื•ืŸ ื”ืจื‘ื” ื™ื•ืชืจ ืคืฉื•ื˜. ื›ืœ ืžื” ืฉืฆืจื™ืš ื”ื•ื ืœืขื“ื›ืŸ ืืช ื”ืคื•ื ืงืฆื™ื” ืฉืœื ื• ืฉืชื“ืข ืœื”ืชืžื•ื“ื“ ืขื ืงืœื˜ื™ื ืžื›ืœ ืžื™ื ื™ ืกื•ื’ื™ื:
function capitalize(itemOrPromise) {
  if (itemOrPromise.then) {
    return itemOrPromise.then(capitalize);
  }

  // Now we know it's an item
  return itemOrPromise.replace(/\b(\w)/g, c => c.toUpperCase());
}
ืื ื”ื™ื ืงื™ื‘ืœื” Promise (ื›ืœื•ืžืจ ืžืฉื”ื• ืฉื™ืฉ ืœื• then) ื”ื™ื ืชืชืœื‘ืฉ ืขืœ ื” then ื•ืชื™ืฉืืจ ื‘ืื•ืชื• ื”ืžืžืฉืง ื›ืš ืฉืชื—ื–ื™ืจ ื’ื Promise. ืื ื”ื™ื ืงื™ื‘ืœื” ืžื—ืจื•ื–ืช ื˜ืงืกื˜ ืขื“ื™ื™ืŸ ื”ื›ืœ ื˜ื•ื‘ ื•ื”ื™ื ืชื—ื–ื™ืจ ืืช ื”ืžื—ืจื•ื–ืช ื”ืžืขื•ื“ื›ื ืช. ื•ืžื™ ืฉื‘ื›ืœืœ ืจื•ืฆื” ืœื”ืชื—ืฉื‘ ื™ื›ื•ืœ ืœื”ื•ืกื™ืฃ ื’ื ื˜ื™ืคื•ืœ ื‘ืžืขืจื›ื™ื ื•ืขืœ ื”ื“ืจืš ื‘ืžืขืจื›ื™ื ืฉืœ Promises:
function capitalize(itemOrPromise) {
  if (Array.isArray(itemOrPromise)) {
    return itemOrPromise.map(capitalize);
  }

  if (itemOrPromise.then) {
    return itemOrPromise.then(capitalize);
  }

  // Now we know it's an item
  return itemOrPromise.replace(/\b(\w)/g, c => c.toUpperCase());
}
ืื ืงื™ื‘ืœื ื• ืžืขืจืš ื ืจื™ืฅ map ื›ื“ื™ ืœื”ืคื•ืš ืœืื•ืชื™ื•ืช ื’ื“ื•ืœื•ืช ืืช ื›ืœ ื”ืชืื™ื ืฉืœื• (ื•ืื ื”ืชืื™ื ื”ื Promises ื”ื›ืœ ืขื“ื™ื™ืŸ ื™ืขื‘ื•ื“); ืื ืงื™ื‘ืœื ื• Promise ืื– ื ื—ื›ื” ืฉื”ื•ื ื™ืกืชื™ื™ื, ื•ืื– ื”ืจืงื•ืจืกื™ื” ืชื˜ืคืœ ื’ื ื‘ืžืงืจื” ืฉืงื™ื‘ืœื ื• Promise ืœืžืขืจืš ื•ื›ืฉืžื’ื™ืขื™ื ื‘ืกื•ืฃ ืœืžื—ืจื•ื–ืช ื˜ืงืกื˜ ืืคืฉืจ ืœืกื™ื™ื ื•ืœื”ืคื•ืš ืืช ื”ืื•ืช ื”ืจืืฉื•ื ื” ื‘ื›ืœ ืžื™ืœื” ืœืื•ืช ื’ื“ื•ืœื”. ืื’ื‘ JavaScript ื•ื”ื›ืœ, ืื– ืื™ืŸ ื’ื ื‘ืขื™ื” ืœื”ื•ืฆื™ื ื”ื—ื•ืฆื” ืืช ื›ืœ ื”ืœื•ื’ื™ืงื” ื”ืจืงื•ืจืกื™ื‘ื™ืช ื›ื“ื™ ืฉื™ื”ื™ื” ืงืœ ืœื”ืฉืชืžืฉ ื‘ื” ืขืœ ื›ืžื” ืคื•ื ืงืฆื™ื•ืช. ื–ื” ื ืจืื” ื›ืš:
function handleAllThenThings(func) {
  return function handler(itemOrPromise) {
    if (Array.isArray(itemOrPromise)) {
      return itemOrPromise.map(handler);
    }

    if (itemOrPromise.then) {
      return itemOrPromise.then(handler);
    }

    // Now we know it's an item
    return func(itemOrPromise);
  };
}

ToCode
1 419
# ืžืชื™ ืœื›ืชื•ื‘ ืงื•ื“ ื’ืจื•ืข ื”ื“ืขื” ื”ืจื•ื•ื—ืช ื”ื™ื ืฉืื ื—ื ื• ื›ื•ืชื‘ื™ื ืงื•ื“ ื’ืจื•ืข ื›ืฉืื™ืŸ ื–ืžืŸ ืœื›ืชื•ื‘ ืงื•ื“ ื˜ื•ื‘ ืื• ื›ืฉืฆืจื™ืš ืœืขื‘ื•ื“ ืžื•ืœ Legacy Code ืงื™ื™ื ืื• ืœื”ืชืžืžืฉืง ืœืงื•ื“ ื—ื™ืฆื•ื ื™ ืฉืื™ืŸ ืœื ื• ืฉืœื™ื˜ื” ืขืœื™ื•. ื›ืžืชื›ื ืชื™ื ืื ื—ื ื• ืื•ื”ื‘ื™ื ืœื—ืฉื•ื‘ ืฉืื ืจืง ื”ื™ื• ื ื•ืชื ื™ื ืœื ื• ืžืกืคื™ืง ื–ืžืŸ, ืžืกืคื™ืง ืžืฉืื‘ื™ื ื•ืžืืคืฉืจื™ื ืœื ื• ืœื”ืฉืชืžืฉ ื‘ื›ืœ ื”ื›ืœื™ื ืฉืื ื—ื ื• ืจื•ืฆื™ื ืื– ื”ื™ื™ื ื• ืžืฆืœื™ื—ื™ื ืœื›ืชื•ื‘ ืงื•ื“ ืžืขื•ืœื”. ื–ื” ืœืขืชื™ื ื ื“ื™ืจื•ืช ื”ืžืงืจื”. ื”ืคื™ืชืจื•ื ื•ืช ื”ื›ื™ ื˜ื•ื‘ื™ื ืฉื›ืชื‘ืชื™ ืœื ื”ื™ื• ืืœื” ืฉื›ืชื‘ืชื™ ืคืขื ืจืืฉื•ื ื”, ืœื ืžืฉื ื” ื›ืžื” ื–ืžืŸ ื”ืฉืงืขืชื™ ื‘ืื•ืชื” ื›ืชื™ื‘ื” ืจืืฉื•ื ื”. ื”ืžื ื’ื ื•ื ื™ื ื”ื›ื™ ื™ืฆื™ื‘ื™ื ื•ื”ื›ื™ ื’ืžื™ืฉื™ื ืฉื”ืฆืœื—ืชื™ ืœื‘ื ื•ืช ื”ื™ื• ืชื•ืฆืื” ืฉืœ Refactoring ื•ื‘ื“ืจืš ื›ืœืœ ื™ื•ืชืจ ืžืื—ื“. ืงื•ื“ ื˜ื•ื‘ ื”ื•ื ื‘ืกืš ื”ื›ืœ ืงื•ื“ ื’ืจื•ืข ืฉืขื‘ืจ ืžืกืคื™ืง ืฉื™ื›ืชื•ื‘ื™ื ื›ื“ื™ ืœื ืงื•ืช ืžืžื ื• ืืช ื”ื‘ืื’ื™ื ื•ืœื˜ืคืœ ื›ืžื• ืฉืฆืจื™ืš ื‘ืžืงืจื™ ื”ืงืฆื”. ืงื•ื“ ื’ื ืจื™ ื”ื•ื ื‘ืกืš ื”ื›ืœ ืงื•ื“ ื’ืจื•ืข ืฉืขื‘ืจ ืžืกืคื™ืง ืฉื›ืชื•ื‘ื™ื ื›ื“ื™ ืฉื‘ืคืขื ื”ื‘ืื” ืฉื ืฆื˜ืจืš ืœื”ื•ืกื™ืฃ ืคื™ืฆ'ืจ ื”ืงื•ื“ ื›ื‘ืจ ื™ื”ื™ื” ืžื•ื›ืŸ ืœืฉื™ื ื•ื™. ื–ื” ืœื ืกืชื ืฉื›ืœ Front End Framwork ืฉื”ื™ืชื” ื‘ืฉื›ื•ื ื” ืžืกืคื™ืง ื–ืžืŸ ืขื‘ืจื” ืื™ื ืกื•ืฃ ืกื‘ื‘ื™ Refactoring ื•ื‘ืฉืœื‘ ืžืกื•ื™ื ื’ื ื›ืชื™ื‘ื” ืžื—ื“ืฉ ืžืืคืก. ื‘ืื ื’ื•ืœืจ ื–ื” ืงืจื” ื‘ืžืขื‘ืจ ืžื’ื™ืจืกื” 1 ืœ-2, ื‘ืจื™ืืงื˜ ื‘ืžืขื‘ืจ ืžื’ื™ืจืกื” 15 ืœ 16 ื•ื‘ื•ื™ื• ื–ื” ื”ื™ื” ื”ืžืขื‘ืจ ืœ Vue3. ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืงืฉืงืฉ ืขื“ ืžื—ืจ ืขืœ Design Patterns ื•ื›ืชื™ื‘ื” ื ื›ื•ื ื”, ืื‘ืœ ื‘ืกื•ืฃ ื›ืฉืžืขืจื›ืช ืคื•ื’ืฉืช ืืช ื”ืขื•ืœื ื“ื‘ืจื™ื ืžืฉืชื ื™ื. ืงื•ื“ ื˜ื•ื‘ ื”ื•ื ืงื•ื“ ื—ื™, ื”ื•ื ืงื•ื“ ืฉืื ื—ื ื• ืœื ืคื•ื—ื“ื™ื ืœื’ืขืช ื‘ื•, ื•ืฉืื ื—ื ื• ืžืฉื ื™ื ืื•ืชื• ื›ืœ ื”ื–ืžืŸ. ืงื•ื“ ื˜ื•ื‘ ื“ื•ืจืฉ ืžืกื’ืจืช - ืฉืœ ื‘ื“ื™ืงื•ืช, ืฉืœ ื ื™ื”ื•ืœ ืชืฆื•ืจื”; ืื‘ืœ ื™ื•ืชืจ ืžื”ื›ืœ ืงื•ื“ ื˜ื•ื‘ ื“ื•ืจืฉ ืงื•ื“ ื’ืจื•ืข ืžืžื ื• ื”ื•ื ื™ื›ื•ืœ ืœื”ืชื—ื™ืœ ื•ืžืชื›ื ืชื™ื ืฉืœื ืžืคื—ื“ื™ื ืœืฉื›ืชื‘ ืขื“ ืฉื”ืงื•ื“ ื™ื”ื™ื” ืžืกืคื™ืง ื˜ื•ื‘. ืœืคื—ื•ืช ืขื“ ื”ืฉื›ืชื•ื‘ ื”ื‘ื.

ToCode
1 419
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-2pz8l        0/1     Completed   0          68m
ingress-nginx-admission-patch-kjrv2         0/1     Completed   0          68m
ingress-nginx-controller-59b45fb494-nvkbg   1/1     Running     0          68m
ืื—ืจื™ ืฉืื ื—ื ื• ื™ื•ื“ืขื™ื ืฉ nginx ืฉืœื ื• ื‘ืื•ื•ื™ืจ ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื›ืชื•ื‘ ืœื• ืงื•ื‘ืฅ ื”ื’ื“ืจื•ืช. ื‘ื’ืœืœ ืงื•ื‘ืจื ื˜ืก ื–ื” ืœื ื™ื”ื™ื” ืงื•ื‘ืฅ ื”ื’ื“ืจื•ืช ืกืคืฆื™ืคื™ ืฉืœ nginx ืืœื ืงื•ื‘ืฅ ื”ื’ื“ืจื•ืช ืฉืœ ืงื•ื‘ืจื ื˜ืก ื•ืงื•ื‘ืจื ื˜ืก ื™ืชืจื’ื ืื•ืชื• ืœื”ื’ื“ืจื•ืช nginx (ืื•ืœื™ ื›ื“ื™ ืฉื™ื•ื ืื—ื“ ื‘ืขืชื™ื“ ื ื•ื›ืœ ืœื”ื—ืœื™ืฃ ืืช ื” Gateway ื‘ื›ื ื™ืกื” ืœืงืœืืกื˜ืจ ื‘ืฆื•ืจื” ืื•ื˜ื•ืžื˜ื™ืช). ื‘ื›ืœ ืžืงืจื” ื›ืชื‘ื• ืงื•ื‘ืฅ ื—ื“ืฉ ื‘ืชื™ืงื™ื™ืช k8s ื‘ืฉื ingress.yaml ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 3000
ื‘ืขื‘ืจื™ืช ื–ื” ืื•ืžืจ ืฉื›ืœ ืคืขื ืฉืžื™ืฉื”ื• ื ื›ื ืก ืœืงืœืืกื˜ืจ ืฉืœื ื• ืœื ืชื™ื‘ ื”ืจืืฉื™ ืื ื—ื ื• ืคืฉื•ื˜ ื ืฉืœื— ืื•ืชื• ืœืกืจื‘ื™ืก web ื‘ืคื•ืจื˜ 3000. ื‘ืขืชื™ื“ ื›ืฉื™ื”ื™ื• ืœื ื• ื™ื•ืชืจ ืกืจื‘ื™ืกื™ื ื ื•ื›ืœ ืœื‘ื ื•ืช ืžืขืจื›ืช ื ื™ืชื•ื‘ ื™ื•ืชืจ ืžืชื•ื—ื›ืžืช, ืื‘ืœ ื–ื” ื›ื‘ืจ ื ื•ืฉื ืœืคื•ืกื˜ ืื—ืจ. ื”ืคืขื™ืœื• ืฉื•ื‘:
$ kubectl apply -f k8s
ื•ืื–:
$ kubectl get ingress
ื•ืื ื”ื›ืœ ืขื‘ื“ ื›ืžื• ืฉืฆืจื™ืš ืชืงื‘ืœื• ืขืœ ื”ืžืกืš ืฉื•ืจื” ืฉื ืจืื™ืช ื‘ืขืจืš ื›ืš ืขื ื›ืชื•ื‘ืช IP ืฉืœ ื”ืงืœืืกื˜ืจ ืฉืœื›ื:
NAME      CLASS    HOSTS   ADDRESS        PORTS   AGE
ingress   <none>   *       192.168.49.2   80      46m
ื›ื ื™ืกื” ื“ืจืš ื”ื“ืคื“ืคืŸ ืื• ืขื curl ืœื›ืชื•ื‘ืช ื” IP ืฉืงื™ื‘ืœืชื ืชื—ื–ื™ืจ ืืช ืื•ื‘ื™ืงื˜ ื” JSON ื”ืจื™ืง:
$ curl 192.168.49.2
{"count":null}
ื•ืฉืœื™ื—ืช ื‘ืงืฉืช POST ืชืขืœื” ืืช ื”ืžื•ื ื” ื‘-1:
$ curl -X POST 192.168.49.2
{"count":1}

$ curl -X POST 192.168.49.2
{"count":2}

$ curl -X POST 192.168.49.2
{"count":3}
## ืžื” ื”ืœืื” ืžื” ื”ืœืื”? ื™ืฉ ืœื›ื ืงืœืืกื˜ืจ ืงื•ื‘ืจื ื˜ืก ืฉืžืจื™ืฅ ืืคืœื™ืงืฆื™ื” ื“ืจืš NGINX, ืฉืžืชื—ื‘ืจ ืœ Redis ื•ืฉื•ืžืจ ืืช ื”ืžื™ื“ืข ื‘ Persistent Volume. ืžื” ืขื•ื“ ืืคืฉืจ ืœืจืฆื•ืช!? ื ื•, ืœื ื™ื•ืชืจ ืžื“ื™. ื”ืฉืœื‘ ื”ื‘ื ื™ื”ื™ื” ืœืขื‘ื•ืจ ืขืœ ืงื‘ืฆื™ ื” yaml ื‘ืชื•ืš ืชื™ืงื™ื™ืช k8s, ืœืงืจื•ื ืื•ืชื ื•ืœื—ืคืฉ ื‘ืชื™ืขื•ื“ ืžื” ื›ืœ ืฉื•ืจื” ื‘ื”ื ืื•ืžืจืช. ืื—ืจื™ ื–ื” ืืคืฉืจ ืœื ืกื•ืช ืœื”ื•ืกื™ืฃ ืขื•ื“ ืกืจื‘ื™ืกื™ื ืœ docker-compose.yml ื•ืœืจืื•ืช ืื™ืš kompose ืžืชืจื’ื ืื•ืชื ื•ืœื ืกื•ืช ืœื”ืคืขื™ืœ ื’ื ืื•ืชื. ืื—ืจื™ ืฉืชืขืฉื• ืืช ื–ื” ืžืกืคื™ืง ืคืขืžื™ื ืื•ืœื™ ื”ืชื™ืขื•ื“ ืฉืœ ืงื•ื‘ืจื ื˜ืก ื›ื‘ืจ ืœื ื™ืจื’ื™ืฉ ื›ืœ ื›ืš ืžืฉืขืžื ื•ืชื•ื›ืœื• ืืคื™ืœื• ืœืงืจื•ื ืื•ืชื• ืžืงืฆื” ืœืงืฆื”. ื .ื‘. ืฉื™ืžื• ืœื‘ ืจืง ืœืฉื•ืจืช ื”ื’ื™ืจืกื” ื‘ docker-compose.yml ืฉืœื›ื. ื‘ืจื•ื‘ ื”ืžืงืจื™ื ื‘ื›ืชื™ื‘ืช docker-compose.yml ืื ื—ื ื• ืžืฆื™ื™ื ื™ื ื’ื™ืจืกื” ื›ืžื” ืฉื™ื•ืชืจ ืžืชืงื“ืžืช, ืื‘ืœ ื‘ืฉื‘ื™ืœ kompose ืฆืจื™ืš ืœื•ื•ืชืจ ืขืœ ื”ื—ืœืง ืฉืื—ืจื™ ื”ื ืงื•ื“ื” ื•ืœืฆื™ื™ืŸ ืคืฉื•ื˜:
version: "3"
ืื ืชืฉื›ื—ื• ืืช ื–ื” ืื– kompose ืคืฉื•ื˜ ื™ื“ืคื™ืก ืฉื’ื™ืื” ืœืžืกืš, ื•ื–ื” ื“ื•ื•ืงื ื ื—ืžื“ ืžืฆื™ื“ื• ื›ื™ ืขืœ ืจื•ื‘ ื”ื“ื‘ืจื™ื ื”ื•ื ืœื ื˜ื•ืจื— ืœื“ื•ื•ื—.

ToCode
1 419
ืื‘ืœ ื”ืจื™ืืœื™ืกื˜ื™ื™ื ืžื‘ื™ืŸ ื”ืงื•ืจืื™ื ื™ื•ื“ืขื™ื ืฉื–ื” ืœื ื”ื•ืœืš ืœืขื‘ื•ื“ ื›ืœ ื›ืš ื‘ืงืœื•ืช. ื”ืคืงื•ื“ื” kubectl apply ืคืฉื•ื˜ ืœื•ืงื—ืช ืงื•ื‘ืฅ ื”ื’ื“ืจื•ืช ืื• ืชื™ืงื™ื” ืฉืœ ืงื‘ืฆื™ ื”ื’ื“ืจื•ืช ื•ืžื ืกื” "ืœื”ืชืงื™ืŸ" ืื•ืชื ืขืœ ื”ืงืœืืกื˜ืจ, ื›ืœื•ืžืจ ืœืฉื ื•ืช ืืช ืžืฆื‘ ื”ืงืœืืกื˜ืจ ื›ื“ื™ ืฉืžื” ืฉื›ืชื•ื‘ ื‘ื”ื’ื“ืจื•ืช ื–ื” ื’ื ืžื” ืฉื™ื”ื™ื” ืขืœื™ื•. ื”ื‘ืขื™ื” ืฉืžื” ืฉื›ืชื•ื‘ ื‘ื”ื’ื“ืจื•ืช ืฉ kompose ื™ืฆืจ ืขื“ื™ื™ืŸ ืœื ืžืกืคื™ืง ืžื•ื›ืŸ. ืืช ื”ื ืงื•ื“ื” ื”ื‘ืขื™ื™ืชื™ืช ื”ืจืืฉื•ื ื” ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืจืื•ืช ื‘ืžื‘ื˜ ื—ื˜ื•ืฃ ืขืœ ื”ืงื‘ืฆื™ื ืฉื ื•ืฆืจื•: ืงื•ืžืคื•ื– ื™ืฆืจ ืฉื ื™ ืงื‘ืฆื™ื ื‘ืฉื‘ื™ืœ ื”ืกืจื‘ื™ืก web ืื‘ืœ ืจืง ืงื•ื‘ืฅ ืื—ื“ ื‘ืฉื‘ื™ืœ ื”ืกืจื‘ื™ืก redis. ื”ืงื‘ืฆื™ื ืฉื ื•ืฆืจื• ืœ web ื”ื ืžืกื•ื’ Deployment ื• Service, ื•ืœ redis ื ื•ืฆืจ ืจืง ืงื•ื‘ืฅ Deployment. ืืชื ื™ื›ื•ืœื™ื ืœืจืื•ืช ืžื” ื”ื”ื‘ื“ืœ ื‘ื™ืŸ ืฉื ื™ ื”ื‘ืœื•ืงื™ื ื‘ืงื•ื‘ืฅ docker-compose.yml ื”ืžืงื•ืจื™ ืฉืœื ื•?
  web:
    image: ynonp/kubedemo:1.0
    ports:
      - "3000:3000"
    deploy:
      restart_policy:
        condition: any

  redis:
    image: "redis:alpine"
    volumes:
      - data:/data

ืื– ื ื›ื•ืŸ ื™ืฉ ื›ืžื” ื”ื‘ื“ืœื™ื ืื‘ืœ ื”ื”ื‘ื“ืœ ื”ืžืจื›ื–ื™ ืฉื’ืจื ืœืงื•ืžืคื•ื– ืœื”ืชื ื”ื’ ืื—ืจืช ื”ื•ื ืฉ web ื”ื’ื“ื™ืจ ืžืคืชื— ports ื• redis ืœื ื”ื’ื“ื™ืจ. ืžื‘ื—ื™ื ืช ืงื•ืžืคื•ื– ืื ืื™ืŸ ืœืš ports ืื™ ืืคืฉืจ ื™ื”ื™ื” ืœื”ืชื—ื‘ืจ ืืœื™ืš (ืœืžืจื•ืช ืฉื‘ docker-compose ืื™ืŸ ื‘ืขื™ื” ืœื”ืชื—ื‘ืจ ืœืกืจื‘ื™ืก ืฉืœื ื”ื’ื“ื™ืจ ืžื™ืคื•ื™ ืคื•ืจื˜ื™ื). ื‘ื›ืœ ืžืงืจื” ื•ื‘ืฉื‘ื™ืœ ืœื”ื™ื•ืช ื ื—ืžื“ื™ื ืœืงื•ืžืคื•ื– ื ืขื“ื›ืŸ ืืช ื”ืงื•ื‘ืฅ ืœื’ื™ืจืกื” ื”ื–ื•:
version: "3"
services:
  web:
    image: ynonp/kubedemo:1.0
    ports:
      - "3000:3000"
    deploy:
      restart_policy:
        condition: any

  redis:
    image: "redis:alpine"
    ports:
      - "6379:6379"
    volumes:
      - data:/data

volumes:
  data:
ื•ื ืจื™ืฅ ืžื—ื“ืฉ ืืช ืงื•ืžืคื•ื–:
$ kompose convert -f docker-compose.yml -o k8s
INFO Kubernetes file "k8s/redis-service.yaml" created 
INFO Kubernetes file "k8s/web-service.yaml" created 
INFO Kubernetes file "k8s/redis-deployment.yaml" created 
INFO Kubernetes file "k8s/data-persistentvolumeclaim.yaml" created 
INFO Kubernetes file "k8s/web-deployment.yaml" created 
ื ื™ืกื™ื•ืŸ ืฉื ื™ ืœื”ืชืงื™ืŸ ืืช ื”ืงื‘ืฆื™ื ืขืœ ื”ืงืœืืกื˜ืจ ื•ื‘ื“ื™ืงื” ืฉืœ ื”ืชื•ืฆืื” ืžื‘ื™ื ืœื ื•:
$ kubectl apply -f k8s
$ kubectl get pods
NAME                     READY   STATUS             RESTARTS   AGE
redis-784899f6c7-mtwzs   1/1     Running            0          5s
web-675ddc94f5-gcz8s     0/1     CrashLoopBackOff   1          5s
ื›ืžื” ืฉืชืจื™ืฆื• ื™ื•ืชืจ ืคืขืžื™ื ืืช kubectl get pods ืชื•ื›ืœื• ืœืจืื•ืช ืฉื‘ืกืš ื”ื›ืœ ืžื•ื ื” ื” Restarts ื™ืขืœื” ืื‘ืœ ื”ืกืจื‘ื™ืก ืฉืœื ื• ืœื ื™ืขื‘ื•ื“. ื‘ื“ื™ืงื” ืฉืœ ื”ืœื•ื’ื™ื ืชืจืื” ืœื›ื ืฉืกืจื‘ื™ืก web ืœื ืžื•ืฆื ืืช ื”ืกืจื‘ื™ืก redis. ื”ืžืฉืš ืžื—ืงืจ ื™ืกืคืจ ืœื›ื ืฉื”ืกื™ื‘ื” ื”ื™ื ืฉืœื ื”ื’ื“ืจื ื• hostname ื‘ docker-compose.yml. ื‘ืžืขื‘ืจ ืžื“ื•ืงืจ ืงื•ืžืคื•ื– ืœืงื•ื‘ืจื ื˜ืก ื”ื›ืœื™ kompose ืœื ื™ื’ื“ื™ืจ ื‘ืฉื‘ื™ืœื›ื ืืช ื” hostname ื‘ืฆื•ืจื” ืื•ื˜ื•ืžื˜ื™ืช ืื ืœื ื”ื’ื“ืจืชื ืื•ืชื• ื‘ืฆื•ืจื” ืžืคื•ืจืฉืช ื‘ืงื•ื‘ืฅ. ื”ืขื“ื›ื•ืŸ ื”ื‘ื ืœ docker-compose.yml ืžื‘ื™ื ืื•ืชื ื• ืœื’ื™ืจืกื” ื”ื–ื•:
version: "3"
services:
  web:
    hostname: web
    image: ynonp/kubedemo:1.0
    ports:
      - "3000:3000"
    deploy:
      restart_policy:
        condition: any

  redis:
    hostname: redis
    image: "redis:alpine"
    ports:
      - "6379:6379"
    volumes:
      - data:/data

volumes:
  data:
ื•ื”ืคืขืœ ื”ืชืงื ื” ื•ื”ืคืขืœื” ืžื—ื“ืฉ ื•ื”ื›ืœ ื›ื‘ืจ ืขื•ื‘ื“:
$ kompose convert -f docker-compose.yml -o k8s
$ kubectl apply -f k8s
$ kubectl get pods

NAME                    READY   STATUS    RESTARTS   AGE
redis-f7f66c7cb-zd9r9   1/1     Running   0          68s
web-6b56cc97d7-mclw2    1/1     Running   2          74s
ืขื›ืฉื™ื• ืื ื™ ื™ื›ื•ืœ ืœื”ื™ื›ื ืก ืœืฉืจืช ื” web ื•ืœื‘ืฆืข ืžืžื ื• curl ื›ื“ื™ ืœืจืื•ืช ืฉื”ื›ืœ ืขื•ื‘ื“:
$ kubectl exec -it web-6b56cc97d7-mclw2 -- /bin/bash
$ curl web:3000/
{"count":null}
ืื‘ืœ ืขื“ื™ื™ืŸ ืœื ื™ื›ื•ืœ ืœื”ืชื—ื‘ืจ ืœืžืขืจื›ืช ืžื‘ื—ื•ืฅ. ื‘ืฉื‘ื™ืœ ื–ื” ืฆืจื™ืš Ingress Controller. ## ื”ื•ืกืคืช ingress ื‘ Kubernetes ื™ืฉ ืžื ื’ื ื•ืŸ ืื•ื˜ื•ืžื˜ื™ ืฉืžืคืขื™ืœ ืฉืจืช Nginx ื‘ื›ื ื™ืกื” ืœืงืœืืกื˜ืจ ืฉืœื›ื ื•ืžื ื”ืœ ืืช ื›ืœ ื”ื—ื™ื‘ื•ืจื™ื ืคื ื™ืžื”. ื ื›ื•ืŸ, ืืคืฉืจ ื”ื™ื” ืœื—ื‘ืจ ืืช ื”ืกืจื‘ื™ืก web ืฉื›ืชื‘ืชื™ ื™ืฉื™ืจื•ืช ืœืคื•ืจื˜ 3000 ืฉืœ ื”ืงืœืืกื˜ืจ ืื‘ืœ ื–ื” ื”ื™ื” ืžืฉืขืžื ื•ืœื ืžืชืื™ื ืœืžืฆื‘ ืคืจื•ื“ืงืฉืŸ. ื‘ืฉื‘ื™ืœ ืœื”ื’ื“ื™ืจ ืืช ืื•ืชื• Nginx ืื•ื˜ื•ืžื˜ื™ ืขืœ minikube ืื ื™ ืžืคืขื™ืœ ืืช ื”ืคืงื•ื“ื”:
$ minikube addons enable ingress
ื•ืื ื”ื›ืœ ืขื‘ื“ ื›ืžื• ืฉืฆืจื™ืš ืืชื ืชื•ื›ืœื• ืœื”ืจื™ืฅ:
$ kubectl get pods -n ingress-nginx
ื•ืœืจืื•ืช ืืช ื”ืคืœื˜:

ToCode
1 419
# ื”ืขืœืืช ืกืจื‘ื™ืก ืž docker-compose ืœ Kubernetes ื“ืจืš ืื—ืช ืœืœืžื•ื“ ืงื•ื‘ืจื ื˜ืก ื”ื™ื ืœืงืจื•ื ืืช ื›ืœ ื“ืคื™ ื”ืชื™ืขื•ื“ ืฉืœื”ื, ืื‘ืœ ื–ื” ืœื•ืงื— ื”ืžื•ืŸ ื–ืžืŸ ื•ืœื ืชืžื™ื“ ืžื‘ื˜ื™ื— ืฉื’ื ื ื‘ื™ืŸ ืืช ืžื” ืฉื ืงืจื. ื“ืจืš ื™ื•ืชืจ ืžืขืฉื™ืช ื”ื™ื ืœืงื—ืช ืคืจื•ื™ืงื˜ ืคืฉื•ื˜ ื•ืœื”ืขืœื•ืช ืื•ืชื• ืขืœ ืงืœืืกื˜ืจ. ื‘ืคื•ืกื˜ ื–ื” ืื ื™ ืืจืื” ืืช ื”ื“ืจืš ื”ืฉื ื™ื” ื•ืžืงื•ื•ื” ืฉื”ื™ื ืชืชืŸ ืœื›ื ื ืงื•ื“ืช ื”ืชื—ืœื” ื˜ื•ื‘ื” ืœืขื‘ื•ื“ื” ืขื k8s. ## ืชื™ืื•ืจ ื”ืคืจื•ื™ืงื˜ ืจืฆื™ืชื™ ืœืžืฆื•ื ืคืจื•ื™ืงื˜ ืคืฉื•ื˜ ืื‘ืœ ืขื“ื™ื™ืŸ ืฉื™ื›ื™ืœ ื”ื™ื‘ื˜ื™ื ืžืขื ื™ื™ื ื™ื ืฉืœ Deployment ื•ืœื›ืŸ ื‘ื—ืจืชื™ ื‘ืฉืจืช Node.JS ืฉืžืฉืชืžืฉ ื‘ื‘ืกื™ืก ื ืชื•ื ื™ื Redis. ืงื•ื‘ืฅ ื” docker-compose.yml ืฉืื ื™ ืžืชื—ื™ืœ ืื™ืชื• ื ืจืื” ื›ืš:
version: "3"
services:
  web:
    image: ynonp/kubedemo:1.0
    ports:
      - "3000:3000"
    deploy:
      restart_policy:
        condition: any

  redis:
    image: "redis:alpine"
    volumes:
      - data:/data

volumes:
  data:
ื”ืื™ืžื’' kubedemo ื ื•ืฆืจ ืžื” Dockerfile ื”ื‘ื:
FROM node:16

# Create app directory
WORKDIR /app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

# Bundle app source
COPY . .

EXPOSE 3000
CMD [ "node", "server.js" ]
ื•ืชื•ื›ืŸ ื”ืงื•ื‘ืฅ server.js ื‘ืื•ืชื” ืชื™ืงื™ื” ื”ื•ื:
const express = require('express')
const app = express()
const port = 3000

let
  redis     = require('redis'),
  /* Values are hard-coded for this example, it's usually best to bring these in via file or environment variable for production */
  client    = redis.createClient({
    port      : 6379,
    host      : 'redis',        // replace with your hostanme or IP address
  });

app.get('/', (req, res) => {
  client.get(req.hostname, (err, count) => {
    if (err) return next(err);
    res.send({ count });
  });
});

app.post('/', (req, res, next) => {
  client.incr(req.hostname, (err, count) => {
    if (err) return next(err);

    res.send({ count });
  });
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})
ื”ืงื•ื‘ืฅ ืžืชื—ื‘ืจ ืœืจื“ื™ืก ื•ื™ื•ื“ืข ืœืงื‘ืœ ืฉื ื™ ืกื•ื’ื™ ื‘ืงืฉื•ืช: ื‘ืงืฉืช GET ืœื ืชื™ื‘ ื”ืจืืฉื™ ืžื—ื–ื™ืจื” ืขืจืš ืžื•ื ื” ืžืกื•ื™ื, ื•ื‘ืงืฉืช POST ืœื ืชื™ื‘ ื”ืจืืฉื™ ืžื’ื“ื™ืœื” ืืช ื”ืžื•ื ื” ื‘-1. ืžื” ืฉื—ืฉื•ื‘ ืžื‘ื—ื™ื ืช ื” Deployment ื–ื” ืฉื™ืฉ ืจืง ืฉืจืช ืื—ืช ืฉืžืงืฉื™ื‘ ืขืœ ืคื•ืจื˜ 3000 ื•ืžืชื—ื‘ืจ ืœืžื›ื•ื ืช ืจื“ื™ืก ืื—ืช. ืžืกืคื™ืง ืคืฉื•ื˜ ื‘ืฉื‘ื™ืœ ืคืจื•ื™ืงื˜ ืงื•ื‘ืจื ื˜ืก ืจืืฉื•ืŸ. ## ื”ืชืงื ื” ื•ื™ืฆื™ืจืช ืงื‘ืฆื™ yaml ืฉืœ Kubernetes ื™ืฉ ื”ืžื•ืŸ ื“ืจื›ื™ื ืœืงื‘ืœ ื’ื™ืฉื” ืœืงืœืืกื˜ืจ ืงื•ื‘ืจื ื˜ืก: ืืชืจ https://labs.play-with-k8s.com/ ื™ื™ืชืŸ ืœื›ื ืงืœืืกื˜ืจ ื‘ื—ื™ื ื ืœ-4 ืฉืขื•ืช. ื›ืœ ืกืคืงื™ ื”ืขื ืŸ ื”ื’ื“ื•ืœื™ื ื™ืชื ื• ืœื›ื ืงืœืืกื˜ืจ ืœืžืฉื—ืงื™ื ื‘ืชื•ื›ื ื™ืช ื”ื—ื™ื ืžื™ืช ืฉืœื”ื ื•ืกืคืงื™ ืขื ืŸ ืงื˜ื ื™ื ื™ื•ืชืจ ื™ืชื ื• ืœื›ื ืงืœืืกื˜ืจ ื‘ืชืฉืœื•ื ืกืžืœื™. ืื‘ืœ ืžื›ืœ ื”ืืคืฉืจื•ื™ื•ืช ืื ื™ ืžื•ืฆื ืฉื”ื›ื™ ื ื•ื—ื” ื”ื™ื ื”ืชืงื ืช minikube ืืฆืœื›ื ืขืœ ื”ืœืคื˜ื•ืค. ื–ื” ืคืฉื•ื˜ ืขื•ื‘ื“ ื”ื›ื™ ืžื”ืจ ื•ื”ื›ื™ ืงืœ ืœืžืฆื•ื ื‘ืขื™ื•ืช. ื›ืืŸ ื™ืฉ ื”ื•ืจืื•ืช ื”ืชืงื ื” ืœื›ืœ ืžืขืจื›ื•ืช ื”ื”ืคืขืœื”: https://minikube.sigs.k8s.io/docs/start/ ืืชื ื™ื•ื“ืขื™ื ืฉื”ืฆืœื—ืชื ืื ืืชื ื™ื›ื•ืœื™ื ืœื”ืคืขื™ืœ:
$ kubectl config current-context
ื•ื”ืžื—ืฉื‘ ืžื“ืคื™ืก ืืช ืžื™ืœืช ื”ืงืกื minikube. ื”ื›ืœื™ ื”ืฉื ื™ ืฉืืฉืชืžืฉ ื‘ื• ื‘ื“ื•ื’ืžื” ื ืงืจื kompose ื•ื”ื•ื ื™ื•ื“ืข ืœื”ืคื•ืš ืงื•ื‘ืฅ docker-compose.yml ืœืงื‘ืฆื™ ื”ื’ื“ืจื•ืช ืฉืœ kubernetes. ืžืชืงื™ื ื™ื ืื•ืชื• ืžื›ืืŸ: https://kompose.io/. ืื—ืจื™ ื”ืชืงื ื” ืžื•ืฆืœื—ืช ืืชื ืฆืจื™ื›ื™ื ืœื”ื™ื•ืช ืžืกื•ื’ืœื™ื ืœื”ืจื™ืฅ ืžืฉื•ืจืช ื”ืคืงื•ื“ื”:
$ kompose version
ื•ืœืงื‘ืœ ืžืฉื”ื• ื›ืžื• 1.22.0. ืื—ืจื™ ืฉื›ืœ ื”ื›ืœื™ื ืžื•ืชืงื ื™ื ื ืฆื ืœื“ืจืš ืขื ื”ืคืจื•ื™ืงื˜. ## ื”ืžืจืช docker-compose.yml ืœืงื‘ืฆื™ k8s ืื ื™ ื™ื•ืฆืจ ืชื™ืงื™ื” ื—ื“ืฉื” ืœื™ื“ ืงื•ื‘ืฅ docker-compose.yml ื•ืงื•ืจื ืœื” k8s. ืื—ืจ ื›ืš ืžืคืขื™ืœ:
$ kompose convert -f docker-compose.yml -o k8s
ื•ืžืงื‘ืœ ืืช ื”ื”ื“ืคืกื”:
INFO Kubernetes file "k8s/web-service.yaml" created 
INFO Kubernetes file "k8s/redis-deployment.yaml" created 
INFO Kubernetes file "k8s/data-persistentvolumeclaim.yaml" created 
INFO Kubernetes file "k8s/web-deployment.yaml" created 
ืขื›ืฉื™ื• ื”ืื•ืคื˜ื™ืžื™ื™ื ืžื•ื–ืžื ื™ื ืœื”ืจื™ืฅ ืืช ื”ืคืงื•ื“ื” ื”ื‘ืื” ื›ื“ื™ ืœื ืกื•ืช ืœื”ืคืขื™ืœ ืืช ื”ืกืจื‘ื™ืก ืขืœ ื”ืงืœืืกื˜ืจ ืฉืœื ื•:
$ kubectl apply -f k8s

ToCode
1 419
# ืคืจื•ืคื•ืจืฆื™ื” ื›ืœ ื™ื•ื ื™ืฉ ืื™ื ืกื•ืฃ ืคื™ืฆ'ืจื™ื ืฉื“ื—ื•ืฃ ืœืกื™ื™ื ื•ื‘ื’ืœืœื ื”ื™ื•ื ืœื ืžืฆืืชื™ ื–ืžืŸ ืœ Refactoring. ื›ืœ ืฉื‘ื•ืข ื™ืฉ ืื™ื ืกื•ืฃ ื‘ืื’ื™ื ืฉื“ื—ื•ืฃ ืœืคืชื•ืจ ื•ื‘ื’ืœืœื ื”ื™ื•ื ืœื ืžืฆืืชื™ ื–ืžืŸ ืœื›ืชื•ื‘ ื‘ื“ื™ืงื•ืช ืื•ื˜ื•ืžื˜ื™ื•ืช. ื›ืœ ื—ื•ื“ืฉ ื™ืฉ ืื™ื ืกื•ืฃ ืžืฉื™ืžื•ืช ื“ื—ื•ืคื•ืช ืฉืœื ื”ืฉืื™ืจื• ืœื™ ื–ืžืŸ ืœืœืžื•ื“ ืžื™ื•ืžื ื•ืช ื—ื“ืฉื”. ื•ื›ืœ ืฉื ื” ื™ืฉ ืื™ื ืกื•ืฃ ื™ืฉื™ื‘ื•ืช ืžื™ื•ืชืจื•ืช ืฉืœื ื”ืฉืื™ืจื• ืœื™ ื–ืžืŸ ืœื™ืฆื•ืจ ืงืฉืจื™ื ืืžื™ืชื™ื™ื ืขื ืื ืฉื™ื ืžื—ื•ืฅ ืœื—ื‘ืจื”. ื•ืขื“ื™ื™ืŸ- ืื ื ืฆืœื™ื— ื›ืœ ื™ื•ื ืœืืจื’ืŸ ืžื—ื“ืฉ ืงืฆืช ืžื”ืงื•ื“ ืฉืœื ื•, ืœืื•ืจืš ื–ืžืŸ ืคื™ืชื•ื— ืคื™ืฆ'ืจื™ื ื™ื”ื™ื” ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ. ืื ื ืฆืœื™ื— ื›ืœ ืฉื‘ื•ืข ืœื›ืชื•ื‘ ืงืฆืช ื‘ื“ื™ืงื•ืช ืื•ื˜ื•ืžื˜ื™ื•ืช, ืœืื•ืจืš ื–ืžืŸ ื™ื”ื™ื• ืคื—ื•ืช ื‘ืื’ื™ื. ืื ื ืฆืœื™ื— ื›ืœ ื—ื•ื“ืฉ ืœืœืžื•ื“ ืืคื™ืœื• ื—ืœืง ืงื˜ืŸ ืžืžื™ื•ืžื ื•ืช ื—ื“ืฉื”, ืœืื•ืจืš ื–ืžืŸ ื ื•ื›ืœ ืœื”ื™ื•ืช ื”ืจื‘ื” ื™ื•ืชืจ ื™ืขื™ืœื™ื ื‘ืขื‘ื•ื“ื” ื•ื‘ื—ื™ื™ื. ื•ืื ื ืฆืœื™ื— ื‘ืžื”ืœืš ื”ืฉื ื” ืœื™ืฆื•ืจ ืงืฉืจื™ื ืžืฉืžืขื•ืชื™ื™ื ืขื ืื ืฉื™ื ืžื—ื•ืฅ ืœื—ื‘ืจื”, ืœืื•ืจืš ื–ืžืŸ ื™ื”ื™ื• ืœื ื• ื”ืจื‘ื” ื™ื•ืชืจ ืื ืฉื™ื ืœื”ื—ืœื™ืฃ ืื™ืชื ืจืขื™ื•ื ื•ืช ื™ืฆื™ืจืชื™ื™ื ื•ื™ื”ื™ื” ืœื ื• ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ืœื‘ื ื•ืช ืžืกืœื•ืœ ืงืจื™ื™ืจื” ืฉืžืชืื™ื ืœื ื•. ืฉืชื”ื™ื” ืœื›ื•ืœื ื• ืฉื ื” ื ืคืœืื”, ืฉื ื“ืข ืœืงื—ืช ืืช ื”ื“ื‘ืจื™ื ื”ื“ื—ื•ืคื™ื ื‘ืคืจื•ืคื•ืจืฆื™ื” ื•ืœืžืฆื•ื ื–ืžืŸ ืœ Refactoring, ืœื‘ื“ื™ืงื•ืช ืื•ื˜ื•ืžื˜ื™ื•ืช, ืœืœื™ืžื•ื“ ืžื™ื•ืžื ื•ื™ื•ืช ื—ื“ืฉื•ืช ื•ืœื™ืฆื™ืจืช ืงืฉืจื™ื ืื™ื›ื•ืชื™ื™ื ืžื—ื•ืฅ ืœืžืขื’ืœ ื”ืงืจื•ื‘ ืฉืœ ื”ืื ืฉื™ื ืฉืื™ืชื ื• ื‘ื—ื‘ืจื”.

ToCode
1 419
# ื˜ื™ืค ื“ื•ืงืจ: ืื™ืš ืœื”ื•ืกื™ืฃ ืงื•ื“ ืื™ืชื—ื•ืœ ืœืื™ืžื’' ื‘ืขื‘ื•ื“ื” ืขื ื“ื•ืงืจ ืื ื—ื ื• ืคื•ื’ืฉื™ื ืื™ืžื’'ื™ื ื˜ื•ื‘ื™ื ื‘ Dockerhub ืฉื”ื™ื• ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืžื•ืฉืœืžื™ื ืื ืจืง ื”ื™ื” ืžืงื•ื ืœื”ื•ืกื™ืฃ ืขื•ื“ ื›ืžื” ืฉื•ืจื•ืช ืงื•ื“ ืœืคื ื™ ืฉื”ืงื•ื ื˜ื™ื™ื ืจ ืขื•ืœื”. ืื ื–ื” ืคื™ืฆ'ืจ ืฉื’ื ืืชื ืฆืจื™ื›ื™ื, ืชืฉืžื—ื• ืœืฉืžื•ืข ืฉื”ื•ื ื“ื™ ืคืฉื•ื˜ ืœืžื™ืžื•ืฉ ื‘ืขื–ืจืช ืฉื ื™ ื”ื˜ืจื™ืงื™ื ื”ื‘ืื™ื. ## ื™ืฆื™ืจืช ืื™ืžื’' ืฉืœื ื• ืฉืžืชื‘ืกืก ืขืœ ืื™ืžื’' ืงื™ื™ื ืœืคื ื™ ืฉืื•ื›ืœ ืœื”ื’ื™ืข ืœื˜ืจื™ืงื™ื ื ืฆื˜ืจืš ืœื‘ื ื•ืช ืื™ืžื’' ื–ื”ื” ืœืื™ืžื’' ืฉืื ื—ื ื• ืจื•ืฆื™ื ืื‘ืœ ืขื ืžืงื•ื ืฉืœื ื• ืœื”ืจื™ืฅ ืืช ื”ืงื•ื“. ืื ื™ ืœื•ืงื— ืืช ื”ืื™ืžื’' ืฉืœ mongo ื‘ืฉื‘ื™ืœ ื”ื“ื•ื’ืžื” ืื‘ืœ ืืคืฉืจ ืœื‘ืฆืข ืžื”ืœืš ื“ื•ืžื” ืขืœ ื›ืœ ืื™ืžื’' ื‘ื“ื•ืงืจื”ืื‘. ื‘ื’ื™ื˜ื”ืื‘ ืื ื™ ืžื•ืฆื ืืช ืชื™ืงื™ื™ืช ื”ืžืงื•ืจ ืฉืœ ื”ืื™ืžื’'. ืฉืœ ืžื•ื ื’ื• ื ืžืฆืืช ื›ืืŸ: https://github.com/docker-library/mongo ืžื–ื”ื” ืืช ื” Dockerfile ืฉืœื” ื•ืžื•ืฆื ื‘ืชื•ื›ื• ืืช ื”ืฉื•ืจื•ืช ืฉืžื’ื“ื™ืจื•ืช Entrypoint ื• CMD. ื‘ืžื•ื ื’ื• ืืœื” ื”ืฉื•ืจื•ืช:
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 27017
CMD ["mongod"]
ื–ื” ืื•ืžืจ ืฉื ืงื•ื“ืช ื”ื›ื ื™ืกื” ืฉืœ ื”ืงื•ื ื˜ื™ื™ื ืจ ื”ื™ื ื”ืงื•ื‘ืฅ /usr/local/bin/docker-entrypoint.sh ืขื ื”ืคืจืžื˜ืจ mongod. ื ืคืชื— ืชื™ืงื™ื” ื—ื“ืฉื” ื•ื ื™ืฆื•ืจ ื‘ืชื•ื›ื” Dockerfile ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
FROM mongo:5

COPY docker-entrypoint.sh /my/docker-entrypoint.sh
RUN chmod +x /my/docker-entrypoint.sh

ENTRYPOINT ["/my/docker-entrypoint.sh"]
CMD ["mongod"]
ื“ืจืกืชื™ ืืช ื” Entrypoint ืขื ืกืงืจื™ืคื˜ ืฉืœื™ - ืฉื›ืœ ืžื” ืฉื”ืกืงืจื™ืคื˜ ืฉืœื™ ื™ืขืฉื” ื”ื•ื ืœื”ืคืขื™ืœ ืืช ื” entrypoint ื”ืžืงื•ืจื™ ืฉืœ ืžื•ื ื’ื•. ืื ื™ ืžืขื‘ื™ืจ ืืช mongod ืœ CMD ื‘ื“ื™ื•ืง ื›ืžื• ืฉืขืฉื• ื‘ืื™ืžื’' ื”ืžืงื•ืจื™, ื•ืžื—ืจื•ื–ืช ื–ื• ืชืขื‘ื•ืจ ื‘ืชื•ืจ ืคืจืžื˜ืจ ืœืกืงืจื™ืคื˜ ืฉืœื™ ื•ืžืžื ื• ืœื ืงื•ื“ืช ื”ื›ื ื™ืกื” ื”ืžืงื•ืจื™ืช. ื”ืกืงืจื™ืคื˜ docker-entrypoint.sh ืฉืœื™ ืื’ื‘ ื”ื•ื ืžืžืฉ ืคืฉื•ื˜:
#!/usr/bin/env bash

/usr/local/bin/docker-entrypoint.sh "$@"
ืฉื ื™ ื”ืงื‘ืฆื™ื ื”ืืœื” ืžืกืคื™ืงื™ื ื‘ืฉื‘ื™ืœ ืœื‘ื ื•ืช ืืช ื”ืื™ืžื’' ื•ืœื ืกื•ืช ืœื”ืจื™ืฅ ืื•ืชื• ื•ืื ื”ื›ืœ ืขื‘ื“ ืชืงื‘ืœื• ืงื•ื ื˜ื™ื™ื ืจ ืฉืœ ืžื•ื ื’ื• ื–ื”ื” ืœื–ื” ืฉื”ื™ื™ืชื ืžืงื‘ืœื™ื ืžื”ืจืฆืช ื”ืื™ืžื’' ื”ืžืงื•ืจื™. ## ื”ืจืฆืช ืงื•ื“ ืœืคื ื™ ืฉื”ื“ื‘ืจ ืฉืจืฆื™ื ื• ืœื”ืคืขื™ืœ ืขื•ืœื” ื”ื—ืœืง ื”ืงืœ ื”ื•ื ืœื”ืคืขื™ืœ ืงื•ื“ ืœืคื ื™ ืฉืžื•ื ื’ื• ืขื•ืœื”. ื›ืœ ืžื” ืฉืฆืจื™ืš ืœืขืฉื•ืช ื”ื•ื ืœื”ื•ืกื™ืฃ ืœ docker-entrypoint.sh ืฉืื ื™ ื›ืชื‘ืชื™ ืืช ื”ืงื•ื“ ืฉืจื•ืฆื™ื ืœืคื ื™ ืฉืžืคืขื™ืœื™ื ืืช docker-entrypoint.sh ืฉืœื”ื. ืœื“ื•ื’ืžื” ื”ืชื•ื›ืŸ ื”ื‘ื ื‘ืงื•ื‘ืฅ ื™ื›ืชื•ื‘ ืœืžืกืš ืฉื•ืจืช ื˜ืงืกื˜ ื•ืจืง ืื– ื™ืจื™ืฅ ืืช ืžื•ื ื’ื•:
#!/usr/bin/env bash

echo "This code runs before mongo"

/usr/local/bin/docker-entrypoint.sh "$@"
## ื”ืจืฆืช ืงื•ื“ ืื—ืจื™ ืฉื”ื“ื‘ืจ ืฉืจืฆื™ื ื• ืœื”ืคืขื™ืœ ืขื•ืœื” ื˜ืจื™ืง ืงืฆืช ื™ื•ืชืจ ืžื•ืจื›ื‘ ื”ื•ื ืœื”ืคืขื™ืœ ืืช ื”ื”ื“ืคืกื” ืื—ืจื™ ืฉืžื•ื ื’ื• ืขืœื”. ื”ืžืฉื—ืง ื›ืืŸ ื”ื•ื ืฉืฆืจื™ืš ืœื”ืคืขื™ืœ ืืช ืžื•ื ื’ื• ื‘ืจืงืข, ืœื—ื›ื•ืช ืฉื”ื•ื ื™ืขืœื”, ืœื”ื“ืคื™ืก ืืช ืžื” ืฉืจื•ืฆื™ื ื•ืื– "ืœื”ืฆื˜ืจืฃ" ืืœื™ื• ื›ื“ื™ ืฉื”ืกืงืจื™ืคื˜ docker-entrypoint.sh ืฉืœื™ ืœื ื™ืกืชื™ื™ื (ืกืงืจื™ืคื˜ entrypoint ืฉืžืฉืื™ืจ ืจืง ืชื”ืœื™ื›ื™ ืจืงืข ืžืกืชื™ื™ื ืžื™ื“ ื•ืกื•ื’ืจ ืื™ืชื• ืืช ื”ืงื•ื ื˜ื™ื™ื ืจ). ืžื™ืœืช ื”ืงืกื ื›ื“ื™ ืœื”ืคืขื™ืœ ืคืงื•ื“ืช bash ื‘ืจืงืข ื”ื™ื & ื•ืžื™ืœืช ื”ืงืกื ืฉืขื•ืฆืจืช ืืช ื”ืกืงืจื™ืคื˜ ืขื“ ืฉืชื”ืœื™ื›ื™ ื”ืจืงืข ืžืกืชื™ื™ืžื™ื ื”ื™ื wait. ื‘ืฉื‘ื™ืœ ืœื”ืคืขื™ืœ ืืช ื”ื”ื“ืคืกื” ืื—ืจื™ ืฉืžื•ื ื’ื• ืขืœื” ืื ื™ ืื•ืกื™ืฃ ืœืงื•ื ื˜ื™ื™ื ืจ ืืช wait-for-it ื•ืืฉืชืžืฉ ื‘ื• ื›ื“ื™ ืœื—ื›ื•ืช ืฉืžื•ื ื’ื• ื™ืขืœื”. ืกืš ื”ื›ืœ ื ืขื“ื›ืŸ ืืช ื” Dockerfile ืœืชื•ื›ืŸ ื”ื‘ื:
FROM mongo:5

COPY docker-entrypoint.sh /my/docker-entrypoint.sh
RUN apt-get update && \
    apt-get install -y wait-for-it && \
    chmod +x /my/docker-entrypoint.sh

ENTRYPOINT ["/my/docker-entrypoint.sh"]
CMD ["mongod"]
ื•ืืช docker-entrypoint.sh ืœืชื•ื›ืŸ ื”ื‘ื:
#!/usr/bin/env bash

(/usr/local/bin/docker-entrypoint.sh "$@") &

wait-for-it localhost:27017

echo "This code runs after mongo is ready"

wait
ื”ื“ื•ื’ืžื” ื‘ืคื•ืกื˜ ื”ื™ืชื” ืขืœ ืžื•ื ื’ื• ืื‘ืœ ื”ื™ื ืขื•ื‘ื“ืช ืขืœ ื›ืœ ืื™ืžื’' ืฉืชืจืฆื•. ื”ื ื” ื”ืฉืœื‘ื™ื ื‘ืงืฆืจื”: 1. ืžื–ื”ื™ื ืืช ื” Entrypoint ื•ื” CMD ืฉืœ ื”ืื™ืžื’', ืจื•ืฉืžื™ื ืื•ืชื ื‘ืฆื“. ื•ื’ื ืืช ื”ืคื•ืจื˜ ืž EXPOSE. 2. ื™ื•ืฆืจื™ื ืื™ืžื’' ืฉืœื ื• ืฉื™ืฉ ืœื• ืกืงืจื™ืคื˜ entrypoint ืฉืžืคืขื™ืœ ืืช ื” entrypoint ื”ืžืงื•ืจื™. ืœื•ืงื—ื™ื ื’ื ืืช ื” CMD ื”ืžืงื•ืจื™ ื•ืื ืจื•ืฆื™ื ืœื”ื™ื•ืช ื ื—ืžื“ื™ื ื’ื ืืช ื” EXPOSE. 3. ืื ืจื•ืฆื™ื ืœื”ืจื™ืฅ ืงื•ื“ ืœืคื ื™ ื”ืื™ืžื’' ื”ืžืงื•ืจื™ ืืคืฉืจ ืคืฉื•ื˜ ืœื”ื•ืกื™ืฃ ืืช ื”ืงื•ื“ ื‘ entrypoint ื”ื—ื“ืฉ ืฉื™ืฆืจื ื•. 4. ืื ืจื•ืฆื™ื ืœื”ืจื™ืฅ ืงื•ื“ ืื—ืจื™ ื”ืื™ืžื’' ื”ืžืงื•ืจื™ ื ื•ืกื™ืฃ ืืช wait-for-it ืœ Dockerfile, ื ืจื™ืฅ ืืช ื”ืื™ืžื’' ื”ืžืงื•ืจื™ ื‘ืจืงืข, ื ืฉืชืžืฉ ื‘ wait-for-it ื›ื“ื™ ืœื—ื›ื•ืช ืฉื”ื•ื ื™ื”ื™ื” ืžื•ื›ืŸ ื•ืื– ื ืจื™ืฅ ืืช ื”ืงื•ื“ ืฉืœื ื•. ื‘ืกื•ืฃ ื ืงืจื ืœ wait ื›ื“ื™ ืฉื”ืกืงืจื™ืคื˜ entrypoint ื”ื—ื“ืฉ ืฉื›ืชื‘ื ื• ืœื ื™ืกืชื™ื™ื ื•ื”ืงื•ื ื˜ื™ื™ื ืจ ื™ืžืฉื™ืš ืœืขื‘ื•ื“.