Docker ComposeαŸ– αž–αžΈαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžšαž αžΌαžαžŠαž›αŸ‹αž•αž›αž·αžαž€αž˜αŸ’αž˜

αž€αžΆαžšβ€‹αž”αž€αž”αŸ’αžšαŸ‚β€‹αž€αžΆαžšβ€‹αž…αž˜αŸ’αž›αž„β€‹αž•αžαžƒαŸ‚αžŸαŸ’αžβ€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αžšαŸ€αž”αž…αŸ†β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž”αŸ’αžšαž˜αžΎαž›β€‹αž˜αžΎαž›β€‹αž€αžΆαžšβ€‹αž…αžΆαž”αŸ‹β€‹αž•αŸ’αžαžΎαž˜β€‹αžœαž‚αŸ’αž‚β€‹αžŸαž·αž€αŸ’αžŸαžΆ "αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž›αžΈαž“αž»αž…"

Docker ComposeαŸ– αž–αžΈαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžšαž αžΌαžαžŠαž›αŸ‹αž•αž›αž·αžαž€αž˜αŸ’αž˜

Docker Compose αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŠαŸαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž„αžΆαžš
αž”αžšαž·αžŸαŸ’αžαžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‡αž„αŸ‹αžŠαŸ‚αž›αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αžœαžΆαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž€αŸ†αžŽαžαŸ‹
αžŸαž˜αžΆαžŸαž’αžΆαžαž»αž“αžΈαž˜αž½αž™αŸ—αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αžŠαŸ„αž™αž’αŸ’αžœαžΎαžαžΆαž˜αžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹ αž“αž·αž„αžŸαžΆαž˜αž‰αŸ’αž‰αž“αŸ…αž€αŸ’αž“αž»αž„ YAML-
αž―αž€αžŸαžΆαžš
.

αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž˜αž€αžŠαž›αŸ‹αž“αŸƒαž’αŸ docker αžαŸ‚αž„ v3 αž―αž€αžŸαžΆαžš YAML αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαž•αž›αž·αžαž€αž˜αŸ’αž˜αž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™
αž…αž„αŸ’αž€αŸ„αž˜ Docker Swarm.

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαžΎαž“αŸαŸ‡αž˜αžΆαž“αž“αŸαž™αžαžΆαž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž―αž€αžŸαžΆαžš docker-compose αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„
αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαž•αž›αž·αžαž€αž˜αŸ’αž˜? αž¬αž”αŸ’αžšαžΎαž―αž€αžŸαžΆαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹
αž†αžΆαž€? αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹, αž”αžΆαž‘, αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜:

  • ធថេរ interpolationαŸ– αž”αŸ’αžšαžΎαž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αž½αž™αž…αŸ†αž“αž½αž“
    αžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαž“αžΈαž˜αž½αž™αŸ—αŸ”
  • αž€αžΆαžšαž”αžŠαž·αžŸαŸαž’αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ– αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžœαž·αž“αžΆαž‘αžΈ (αž¬αžŽαžΆαž˜αž½αž™αŸ”
    αž―αž€αžŸαžΆαžšαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž”αž“αŸ’αžŸαŸ†αž˜αž½αž™αž‘αŸ€αž) docker-compose αžŠαŸ‚αž›αž“αžΉαž„αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž’αŸ’αžœαžΈαž˜αž½αž™αž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„
    αž‡αžΆαžŠαŸ†αž”αžΌαž„ αž αžΎαž™ docker compose αž“αžΉαž„αžαŸ‚αžšαž€αŸ’αžŸαžΆαž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž―αž€αžŸαžΆαžšαž‘αžΆαŸ†αž„αž–αžΈαžšαŸ”

αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžšαžœαžΆαž„αž―αž€αžŸαžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜

αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž“αŸƒαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž’αŸ’αž“αž€αž‘αŸ†αž“αž„αž‡αžΆαž…αž„αŸ‹αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΌαžŠαž“αŸ…αž€αŸ’αž“αž»αž„
αž–αŸαž›αžœαŸαž›αžΆβ€‹αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž€αž˜αŸ’αžšαž·αžαžŸαŸ†αž‘αŸαž„αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΌαžŠαž”αŸ’αžšαž—αž–αžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹
αž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ‚αž›αž˜αžΆαž“αžšαž™αŸˆαž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αžšαž·αž™αžΆαž€αžΆαžŸαž•αž›αž·αžαž€αž˜αŸ’αž˜
αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αž‚αžΊαž˜αž·αž“αžŸαž˜αžšαž˜αŸ’αž™αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αž›αž·αž αž’αŸ’αž“αž€αž˜αžΆαž“αž…αž„αŸ’αž€αŸ„αž˜αžŠαŸ‚αž›αž˜αžΆαž“αžαŸ’αž“αžΆαŸ†αž„αž‡αžΆαž…αŸ’αžšαžΎαž“ αž αžΎαž™αž”αžšαž·αž˜αžΆαžŽαž‚αžΊαž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€
αž‘αžΆαž€αŸ‹αž‘αž„αž‘αŸ…αž“αžΉαž„αžαŸ’αž“αžΆαŸ†αž„αžŠαŸ‚αž›αž€αž»αž„αžαžΊαž“αŸαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ (αž¬αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜) αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αž“αž€αž˜αž·αž“αž’αŸ’αžœαžΎαž‘αŸαŸ”
αž’αŸ’αž“αž€αž’αžΆαž…αž˜αŸ‰αŸ„αž“αž€αžΌαžŠαž”αŸ’αžšαž—αž–αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αžŠαŸ‚αž›αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›
αž€αžΆαžšαž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αž€αžΌαžŠ αžŸαž‰αŸ’αž‰αžΆαŸ”αž›αŸ”

αž•αŸ’αž‘αž»αž™αž‘αŸ…αžœαž·αž‰ αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž™αžΎαž„αž…αž„αŸ‹αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αŸ†αžŽαŸ‚αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαž€αžΌαžŠαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”
αžœαžΆαž‡αžΆαž‘αž˜αŸ’αž›αžΆαž”αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžœαžΆαžŠαŸ„αž™αžŸαŸ’αž›αžΆαž€αžŸαž˜αžšαž˜αŸ’αž™ (αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎ semantic
αž€αŸ†αžŽαŸ‚ αž¬αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžαžΆαž˜αž€αžΆαžšαžŸαŸ†αžšαŸαž…αž…αž·αžαŸ’αžαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€)αŸ”

αž”αžŠαž·αžŸαŸαž’αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’

αžŠαŸ„αž™αž‚αž·αžαž–αžΈαž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆ αž“αž·αž„αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž’αžΆαž…αžαž»αžŸαž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌ
αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αž€αžΆαžšαž•αž›αž·αž αžœαžΆαž…αŸ’αž”αžΆαžŸαŸ‹αžŽαžΆαžŸαŸ‹αžαžΆαž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαŸ”

Docker Compost αž‚αžΆαŸ†αž‘αŸ’αžšαž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αžΌαžœαž―αž€αžŸαžΆαžšαžαŸ‚αž„αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž‘αŸ…
αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™αŸ” αžšαž”αŸ€αž”αžŠαŸ‚αž›αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαŸ–

$ cat docker-compose.yml
version: "3.2"

services:
  whale:
    image: docker/whalesay
    command: ["cowsay", "hello!"]
$ docker-compose up
Creating network "composeconfigs_default" with the default driver
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ________
whale_1  | < hello! >
whale_1  |  --------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αž“αž·αž™αžΆαž™ Docker Compos αž‚αžΆαŸ†αž‘αŸ’αžšαž€αžΆαžšαž•αŸ’αžŸαŸ†αž€αžΆαžšαžαŸ‚αž„αž…αŸ’αžšαžΎαž“ -
αž―αž€αžŸαžΆαžšαž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αžŠαž·αžŸαŸαž’αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž•αŸ’αžŸαŸαž„αŸ—αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž‘αžΈαž–αžΈαžšαŸ” αž§αž‘αžΆαž αžšαžŽαŸ:

$ cat docker-compose.second.yml
version: "3.2"
services:
  whale:
    command: ["cowsay", "bye!"]

$ docker-compose -f docker-compose.yml -f docker-compose.second.yml up
Creating composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ______
whale_1  | < bye! >
whale_1  |  ------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

αžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸαŸ‡αž˜αž·αž“αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž‘αŸαž€αŸ’αž“αž»αž„αž€αŸ†αž‘αž»αž„αž–αŸαž›αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ
αž“αžΉαž„αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž…αŸ’αžšαžΎαž“αžŠαž„αŸ”

αžŸαŸ†αžŽαžΆαž„αž›αŸ’αž’ αž―αž€αžŸαžΆαžš docker αžαŸ‚αž„αžšαž€αž˜αžΎαž›αž―αž€αžŸαžΆαžšαž–αž·αžŸαŸαžŸαžŠαŸ‚αž›αž αŸ…αžαžΆαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·
docker-compose.override.yml αžŠαžΎαž˜αŸ’αž”αžΈαž”αžŠαž·αžŸαŸαž’αžαž˜αŸ’αž›αŸƒ docker-compose.ymlαŸ” αž”αžΎ
αž”αŸ’αžαžΌαžšαžˆαŸ’αž˜αŸ„αŸ‡αž―αž€αžŸαžΆαžšαž‘αžΈαž–αžΈαžš αž’αŸ’αž“αž€αž‘αž‘αž½αž›αž”αžΆαž“αž›αž‘αŸ’αž’αž•αž›αžŠαžΌαž…αž‚αŸ’αž“αžΆ αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΎαž˜αŸ–

$ mv docker-compose.second.yml docker-compose.override.yml
$ docker-compose up
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ______
whale_1  | < bye! >
whale_1  |  ------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

αž˜αž·αž“αž’αžΈαž‘αŸ αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž…αž„αž…αžΆαŸ†αŸ”

Interpolation of Variables

αž‚αžΆαŸ†αž‘αŸ’αžšαž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž’αž“αŸ’αžαžšαž”αŸ‰αžΌαž›αŸ”
ធថេរ
αž“αž·αž„αžαž˜αŸ’αž›αŸƒαž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αŸ” αž“αŸ„αŸ‡αž‚αžΊαž’αŸ’αž“αž€αž’αžΆαž…αž’αŸ’αžœαžΎαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸˆ

services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
...

αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž’αŸ’αžœαžΎ docker-compose build (ឬ push) αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαž”αŸ’αžšαŸ‚αž”αŸ’αžšαž½αž›αž”αžšαž·αžŸαŸ’αžαžΆαž“
$MY_SERVICE_VERSION, αžαž˜αŸ’αž›αŸƒαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎ αžαŸ’αž˜αžΈαž”αŸ†αž•αž»αžαž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž€αŸ†αžŽαžαŸ‹
αžαž˜αŸ’αž›αŸƒαž“αŸƒαž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αž˜αž»αž“αž–αŸαž›αžŸαžΆαž„αžŸαž„αŸ‹ αžœαžΆαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž–αŸαž›αžŸαžΆαž„αžŸαž„αŸ‹ αž¬αžšαž»αž‰
αž‘αŸ…αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ private.registry.mine.

αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž•αž„αžŠαŸ‚αžšαŸ” αžαŸ’αž‰αž»αŸ†αž’αŸ’αžœαžΎαžαžΆαž˜αž‘αžΆαŸ†αž„αž“αŸαŸ‡
αž…αŸ’αž”αžΆαž”αŸ‹αžŸαžΆαž˜αž‰αŸ’αž‰αŸ–

  • αž‡αž„αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αž›αž·αžαž€αž˜αŸ’αž˜ αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ (αž¬αž”αžšαž·αžŸαŸ’αžαžΆαž“αž•αŸ’αžŸαŸαž„αž‘αŸ€αž) αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαžΆαž˜αžšαž™αŸˆ
    docker-αžαŸ‚αž„αž―αž€αžŸαžΆαžš
  • αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž”αžšαž·αžŸαŸ’αžαžΆαž“αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαžΆαž˜αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αŸ”
    αž‡αŸ€αžŸαžœαžΆαž„αž€αžΆαžšαž…αž˜αŸ’αž›αž„αŸ”
  • αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™ αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαž“αžΈαž˜αž½αž™αŸ—αŸ”
  • αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαŸ†αžαžΆαž“αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš docker-compose.yml.
  • αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αžŸαŸ’αž›αžΆαž€αžšαžΌαž”αž—αžΆαž–αž¬αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”
    αž’αžαŸαžšβ€‹αžŠαŸ‚αž›β€‹αž’αžΆαž…β€‹αž”αŸ’αžšαŸ‚αž”αŸ’αžšαž½αž›β€‹αž–αžΈβ€‹αž”αžšαž·αžŸαŸ’αžαžΆαž“β€‹αž˜αž½αž™β€‹αž‘αŸ…β€‹αž˜αž‡αŸ’αžˆαžŠαŸ’αž‹αžΆαž“β€‹αž˜αž½αž™ (αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž› αžŸαž˜αžΆαž αžšαžŽαž€αž˜αŸ’αž˜β€‹αŸ”
    αž•αž›αž·αžαž•αž›)αŸ”
  • αžαž˜αŸ’αž›αŸƒαž“αŸƒαž’αžαŸαžšαž•αž›αž·αžαž€αž˜αŸ’αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž‡αžΆαžαž˜αŸ’αž›αŸƒαžŸαž˜αŸ’αžšαžΆαž”αŸ‹
    αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αžœαžΆαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž αžΆαž“αž·αž—αŸαž™αž±αŸ’αž™αžαž·αž…αž”αŸ†αž•αž»αž αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž‡αž„αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“
    αž€αŸ†αžŽαžαŸ‹αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αŸ”
  • αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαž•αž›αž·αžαž€αž˜αŸ’αž˜ αžŸαžΌαž˜αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‡αž„αŸ‹ docker β€” αžαŸ‚αž„-αž―αž€αžŸαžΆαžš docker-compose.yml β€”with-registry-auth my-stack-name.
  • αž”αžšαž·αž™αžΆαž€αžΆαžŸαž€αžΆαžšαž„αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ docker-compose -d.

αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž§αž‘αžΆαž αžšαžŽαŸαžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αŸ”

# docker-compose.yml
...
services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
    environment:
      API_ENDPOINT: ${API_ENDPOINT:-https://production.my-api.com}
...

И

# docker-compose.override.yml
...
services:
  my-service:
    ports: # This is needed for development!
      - 80:80
    environment:
      API_ENDPOINT: https://devel.my-api.com
    volumes:
      - ./:/project/src
...

αžαŸ’αž‰αž»αŸ†αž’αžΆαž…αž”αŸ’αžšαžΎ docker-compose (docker-compose up)αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αž„αŸ‹
αžšαž”αŸ€αž”αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‡αžΆαž˜αž½αž™αž€αžΌαžŠαž”αŸ’αžšαž—αž–αžŠαŸ‚αž›αž”αžΆαž“αž˜αŸ‰αŸ„αž“αž“αŸ…αž€αŸ’αž“αž»αž„ / αž‚αž˜αŸ’αžšαŸ„αž„ / src.

αžαŸ’αž‰αž»αŸ†αž’αžΆαž…αž”αŸ’αžšαžΎαž―αž€αžŸαžΆαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž€αŸ’αž“αž»αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜! αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž–αž·αžαž‡αžΆαž’αžΆαž…αž”αŸ’αžšαžΎαž”αžΆαž“αŸ”
αž―αž€αžŸαžΆαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ” docker-compose.yml αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαž˜αŸ’αžαŸ‚αž„αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž–αž„αŸ’αžšαžΈαž€αž“αŸαŸ‡αž‘αŸ…
αž•αž›αž·αžαž€αž˜αŸ’αž˜ αžαŸ’αž‰αž»αŸ†αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž αž“αž·αž„αž•αŸ’αž‰αžΎαžšαžΌαž”αž—αžΆαž–αž‡αžΆαž˜αž½αž™αžŸαŸ’αž›αžΆαž€αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‡αžΆαž˜αž»αž“
αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž› CIαŸ–

export MY_SERVICE_VERSION=1.2.3
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml push

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αž›αž·αž αžœαžΆαž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

export MY_SERVICE_VERSION=1.2.3
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αž’αŸ’αžœαžΎαžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸ…αž›αžΎαž†αžΆαž€ αž’αŸ’αž“αž€αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹
αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αŸ–

export MY_SERVICE_VERSION=1.2.3
export API_ENDPOINT=http://staging.my-api.com
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αž™αžΎαž„αž”αžΆαž“αž”αŸ’αžšαžΎαž―αž€αžŸαžΆαžš docker-compose αž–αžΈαžšαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆ αžŠαŸ‚αž›αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“
αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαŸ’αž‘αž½αž“αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αžšαž·αžŸαŸ’αžαžΆαž“αžŽαžΆαž˜αž½αž™αžŠαŸ‚αž›αž’αŸ’αž“αž€αž˜αžΆαž“!

αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆ "αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž›αžΈαž“αž»αž…"

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹