ΠΡΠ΅Π²ΠΎΠ΄ Π½Π° ΡΡΠ°Π½ΡΠΊΡΠΈΠΏΡΠΈΡΡΠ° Π½Π° ΠΏΠΎΠ΄ΠΊΠ°ΡΡΠ°, ΠΈΠ·Π³ΠΎΡΠ²Π΅Π½ Π² ΠΎΡΠ°ΠΊΠ²Π°Π½Π΅ Π½Π° Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΠΊΡΡΡΠ°
Docker Compose Π΅ Π½Π΅Π²Π΅ΡΠΎΡΡΠ΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π΄Π΅ΡΠΊΡΠΎΠΏ
ΡΡΠ΅Π΄Π° Π·Π° ΡΡΠ΅ΠΊΠ°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π²ΡΠ² Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π²ΠΈ Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠ΅
Π²ΡΠ΅ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π° Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠ»Π΅Π΄Π²Π°ΠΉΠΊΠΈ ΡΡΠ΅Π½ ΠΈ ΠΏΡΠΎΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ
ΡΠ°ΠΉΠ»ΠΎΠ²Π΅
Π‘ ΠΏΠΎΡΠ²Π°ΡΠ° Π½Π°
ΠΊΠ»ΡΡΡΠ΅Ρ
ΠΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π° Π»ΠΈ ΡΠΎΠ²Π°, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΡΡΠΈΡ ΡΠ°ΠΉΠ» Π·Π° ΡΡΡΡΠ°Π²ΡΠ½Π΅ Π½Π° docker Π²
ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π° ΡΡΠ΅Π΄Π°? ΠΠ»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΡΡΡΠΈΡ ΡΠ°ΠΉΠ» Π·Π°
ΠΏΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ°? Π, ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ, Π΄Π°, Π½ΠΎ Π·Π° ΡΠ°ΠΊΠ°Π²Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
- ΠΠ½ΡΠ΅ΡΠΏΠΎΠ»Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ: ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° Π·Π° Π½ΡΠΊΠΎΠΈ
ΡΠ΅Π½Π½ΠΎΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ Π²ΡΠ² Π²ΡΡΠΊΠ° ΡΡΠ΅Π΄Π°. - ΠΡΠΌΡΠ½Π° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°: Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½Π΅ Π½Π° Π²ΡΠΎΡΠΈ (ΠΈΠ»ΠΈ ΠΊΠΎΠΉΡΠΎ ΠΈ Π΄Π° Π΅
Π΄ΡΡΠ³ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°Ρ) docker-compose ΡΠ°ΠΉΠ», ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π½Π΅ΡΠΎ ΠΎΡΠ½ΠΎΡΠ½ΠΎ
ΠΏΡΡΠ²ΠΈΡΡ, Π° docker compose ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ³ΡΠΈΠΆΠΈ Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π΄Π²Π°ΡΠ° ΡΠ°ΠΉΠ»Π°.
Π Π°Π·Π»ΠΈΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π²ΠΎΠΉΠ½ΠΈ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅
ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π°ΠΉ-Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΅ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π°
ΡΠ΅ΠΆΠΈΠΌ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅. ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΌΠΎΠ½ΡΠΈΡΠ° ΡΠΎΠΌΡΡ Ρ ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΠΊΠΎΠΉΡΠΎ ΡΡΠ΄ΡΡΠΆΠ° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠΎ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π° ΡΡΠ΅Π΄Π°
ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π½Π΅ Π΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡ.
Π ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΊΠ»ΡΡΡΠ΅Ρ Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²ΡΠ·Π»ΠΈ ΠΈ ΠΎΠ±Π΅ΠΌΡΡ Π΅ Π»ΠΎΠΊΠ°Π»Π΅Π½
ΡΠΏΡΡΠΌΠΎ Ρ
ΠΎΡΡΠ°, Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π²Π°ΡΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ (ΠΈΠ»ΠΈ ΡΡΠ»ΡΠ³Π°), ΡΠ°ΠΊΠ° ΡΠ΅ Π½Π΅ Π³ΠΎ ΠΏΡΠ°Π²ΠΈΡΠ΅
ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΌΠΎΠ½ΡΠΈΡΠ°ΡΠ΅ ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π±Π΅Π· ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ Π²ΠΊΠ»ΡΡΠ²Π°Ρ
ΠΊΠΎΠ΄ΠΎΠ²Π° ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ, ΡΠΈΠ³Π½Π°Π»ΠΈ ΠΈ Π΄Ρ.
ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ²Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° Π²Π΅ΡΡΠΈΡ Π½Π° Π²Π°ΡΠΈΡ ΠΊΠΎΠ΄.
ΠΠ±ΠΈΡΠ°ΠΉΠ½ΠΎ Π΅ Π΄Π° Π³ΠΎ ΠΌΠ°ΡΠΊΠΈΡΠ°ΡΠ΅ ΡΡΡ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡ Π΅ΡΠΈΠΊΠ΅Ρ (ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ΅ΠΌΠ°Π½ΡΠΈΡΠ΅Π½
Π²Π΅ΡΡΠΈΡ ΠΈΠ»ΠΈ Π΄ΡΡΠ³Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΠΎ Π²Π°Ρ ΠΈΠ·Π±ΠΎΡ).
ΠΡΠΌΡΠ½Π° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°
ΠΠ°ΡΠΎ ΡΠ΅ ΠΈΠΌΠ°Ρ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ ΡΠ°Π·Π»ΠΈΠΊΠΈΡΠ΅ ΠΈ ΡΠ΅ Π²Π°ΡΠΈΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π°Ρ Π² ΡΡΠ΅Π½Π°ΡΠΈΠΈΡΠ΅
ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ, ΡΡΠ½ΠΎ Π΅, ΡΠ΅ ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
Docker compose ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠ°Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΊΡΠΌ
Π²Π·Π΅ΠΌΠ΅ΡΠ΅ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ Π² ΠΏΡΠΈΠΌΠ΅Ρ:
$ 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 compose ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ compose-
ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΡΠΎΠ²Π° Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΎΠΏΡΠΈΠΈ Π²ΡΠ² Π²ΡΠΎΡΠΈΡ ΡΠ°ΠΉΠ». ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
$ 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 compose Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΡΡΡΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΡΠ°ΠΉΠ» Ρ ΠΈΠΌΠ΅
docker-compose.override.yml Π·Π° Π·Π°ΠΌΡΠ½Π° Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π΄ΠΎΠΊΠ΅Ρ-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
ΠΠΎΠ±ΡΠ΅, ΡΠΎΠ²Π° Π΅ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ Π·Π° Π·Π°ΠΏΠΎΠΌΠ½ΡΠ½Π΅.
ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΠΈΠ½ΡΠ΅ΡΠΏΠΎΠ»Π°ΡΠΈΡ
ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅
ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
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.
ΠΠΎΠΈΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ
ΠΠΎΠ΄Ρ
ΠΎΠ΄ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ° ΡΠ΄ΠΎΠ±Π½ΠΈ Π·Π° ΠΌΠ΅Π½, ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Π·Π° Π²Π°Ρ. Π‘Π»Π΅Π΄Ρ ΡΠΎΠ²Π°
ΠΏΡΠΎΡΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°:
- ΠΡΠΈΡΠΊΠΈ ΠΌΠΎΠΈ ΡΡΠ΅ΠΊΠΎΠ²Π΅ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° (ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΠ΅Π΄ΠΈ) ΡΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΡΡΠ΅Π·
Π΄ΠΎΠΊΠ΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. - ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΏΠΎΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΌΠΎΠΈ ΡΡΠ΅Π΄ΠΈ, ΠΌΠ°ΠΊΡ.
ΠΈΠ·Π±ΡΠ³Π²Π°ΠΉΡΠ΅ Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅. - ΠΠΌΠ°ΠΌ Π½ΡΠΆΠ΄Π° ΠΎΡ Π΅Π΄Π½Π° ΠΏΡΠΎΡΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΡ Π²ΡΠ² Π²ΡΡΠΊΠ° ΡΡΠ΅Π΄Π°.
- ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½Π° Π²ΡΠ² ΡΠ°ΠΉΠ»Π° Π΄ΠΎΠΊΠ΅Ρ-compose.yml.
- ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½Π΅ Π½Π° Π΅ΡΠΈΠΊΠ΅ΡΠΈ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈ
ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ ΠΎΡ ΡΡΠ΅Π΄Π° Π² ΡΡΠ΅Π΄Π° (ΠΏΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ°, ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ,
ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ). - Π‘ΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΊΠ°ΡΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΎΡ
ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΡΠΎΠ²Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ° ΡΠΈΡΠΊΠΎΠ²Π΅ΡΠ΅, Π°ΠΊΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΡΡΠ΅ΠΊΠ° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ Π±Π΅Π·
Π·Π°Π΄Π°ΠΉΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°. - ΠΠ° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΡΡΠ»ΡΠ³Π° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π° ΡΡΠ΅Π΄Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° Π΄ΠΎΠΊΠ΅Ρ ΡΡΠ΅ΠΊ - ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ».
- Π Π°Π±ΠΎΡΠ½Π°ΡΠ° ΡΡΠ΅Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π΄ΠΎΠΊΠ΅Ρ-ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Π½Π°Π³ΠΎΡΠ΅ -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)Π·Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΡΡΠ΅ΠΊΠ°
ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Ρ ΠΌΠΎΠ½ΡΠΈΡΠ°Π½ ΠΈΠ·Ρ
ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ /ΠΏΡΠΎΠ΅ΠΊΡ/ΡΡΡ.
ΠΠΎΠ³Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΡΡΡΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ! Π Π±ΠΈΡ
ΠΌΠΎΠ³ΡΠ» Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΡΠΎΡΠ½ΠΎ
ΡΡΡΠΈΡ ΡΠ°ΠΉΠ» Π΄ΠΎΠΊΠ΅Ρ-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