https://github.com/docker/compose/issues/4315 ์์ ๋ณผ ์ ์๋ฏ์ด docker-compose
์กด์ฌํ๋ extends
๊ธฐ๋ฅ์ ๋จ์ ์๋ ๋ถ๊ตฌํ๊ณ ์ฌ์ฉ์๋ค ์ฌ์ด์์ ์ธ๊ธฐ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ง๊ธ๊น์ง ์์ง์ Compose ํ์ ๊ตฌํ์ ์ถ๊ฐ๋์ง ์์์ต๋๋ค. ์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋ ์ฌ์ฉ์์๊ฒ v3๋ฅผ ์ฌ์ฉํ ๋ Compose ํ์ผ ๊ตฌ์กฐ๋ฅผ ๋จ์ํ๊ฒ ํ๋ฉดํํ๋ผ๊ณ ์กฐ์ธํ์ง๋ง ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ฅ๊ธฐ์ ์ธ ์๋ฃจ์
์
๋๊น? ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ฒ ๋ ์ฌ์ฉ์์๊ฒ ๋ช
ํํ ์
๊ทธ๋ ์ด๋ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
cc @dnephin @vdemeester
docker compose file 2.1 ๋ฒ์ ๊น์ง ์กด์ฌํ๋ฏ๋ก ๋ค์ ๊ฐ์ ธ์ค๋ ๋ช ๊ฐ์ง ๋ฉ๋ชจ๋ฅผ https://github.com/docker/compose/issues/4315#issuecomment -280617251 ์ถ๊ฐํ์ต๋๋ค. Miss๋ ์ถ์ ์๋น์ค๋ฅผ ์ ์ธํ ์ ์๋ ๊ฒ์ ๋๋ค(์คํํด์๋ ์ ๋์ง๋ง ํธ์๋ฅผ ์ํด ์๋น์ค์ ๊ณตํต ์์ฑ์ ๊ทธ๋ฃนํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์).
extends
์๋ ๋ฐฉ์์ด ์ฝ๊ฐ ์คํ๋ฅดํ์ ์ด๋ผ๋ docker/compose#4315์ ์๊ฒฌ์ ๋์ํ์ต๋๋ค.
์๋ฃจ์ ์ ๊ถ์ฅํ์ง๋ ์์ง๋ง ๋จ์ฉ์ ์ ๋๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด FWIW ์์ฑ ํ์ผ์ ์๋จ์ ์ฅ์ํ๋ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#
# Docker Compose configuration
#
# Due to lack of "expressivity" in Compose, we define our own couple of service
# "pseudo-types":
#
# - image-only services (name: *-image)
#
# The only goal of these is to build images. No other services build images.
#
# These have entrypoint overridden to exit immediately.
#
# - base services (name: *-base)
#
# These contain common configuration and are intended to be extended.
#
# Their command (not entrypoint, to keep the original one) is overridden to
# exit immediately. Service must support a command to exit immediately.
#
# - task services (name: *-task)
#
# These are intended for running one-off commands.
#
# Their default command is overridden to exit immediately. Service must
# support a command to exit immediately.
#
# - "real" services
#
# These are actual services that stay up and running.
#
version: '2'
services:
...
๋๋ v2.1์์์ ๊ฐ์ด ํ์ฅ์ด ์ข์ ์ ํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. Extends๋ ์ค์ ๋ก ๊ฐ๋จํ๊ณ ์ดํดํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๊ฐ ํ๊ฒฝ์ ๋ํด dev, prod ๋ฐ env ๊ฐ์ ์ฝ๊ฐ์ ์ฝ๊ธฐ ์ฌ์ด ๋ณํ์ ๊ฐ๋ ๋๋ฌด ์ข์ ๊ดํ์ ๋๋ค.
์ฌ์ค, ๋๋
์ด๊ฒ์ ์๋ํฉ๋๋ค. ์ ์ฐ๋ฆฌ๊ฐ ์ด ํฐ์ผ์์ ์์ ํ ์ฌ์์ฑ์ ๊ฒ์ํด์ผ ํ๋์ง ์ดํดํ์ง ๋ชปํ์ง๋ง ๋ ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์ ์ ์งํด์ผ ํฉ๋๋ค. Extends๋ ๋ค๋ฅธ ๊ธฐ์ ์ด ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ ํน๋ณํ ์ฌ์ฉ ์ฌ๋ก์ ์ข์ ๋ถ๋ถ์ ๋๋ค. ํ์ฅ ๊ฐ๋ฅ์ฑ์ ๋ง์กฑํฉ๋๋ค.
v3.x ํ์์ผ๋ก์ ์ ๊ทธ๋ ์ด๋๋ ์ฐจ๋จํฉ๋๋ค.
๋์ปค ์ปจํ
์ด๋ ์ ์๋ฅผ ์ธ์คํด์ค๋น ํด๋ ๋ ์ด์์์ผ๋ก ์ ์งํฉ๋๋ค. ์ฌ๊ธฐ์ ๊ฐ ํด๋์๋ ์ปจํ
์ด๋ ์ธ์คํด์ค์ ๋ํ ํ๊ฒฝ ํน์ฑ์ ์ ์ํ๋ docker-compose.yml
๊ฐ ํฌํจ๋ฉ๋๋ค. ๊ณตํต ํญ๋ชฉ(DRY)์ ์ ์ธํ๊ธฐ ์ํด ์์ ํด๋์ ๊ธฐ๋ณธ ์๋น์ค ์ ์๋ฅผ ์ฌ์ฉํ๊ณ extend
ํฉ๋๋ค.
๋ฐ๋ผ์ ํน์ ์ปจํ
์ด๋ ์ธ์คํด์ค๋ฅผ ๊ด๋ฆฌํด์ผ ํ ๋ ์ฌ๋ฐ๋ฅธ ํด๋์ cd
๋ง ์์ผ๋ฉด ์ถ๊ฐ ๊ตฌ์ฑ ์์ด docker-compose ๋ช
๋ น์ ์ง์ ์คํํ ์ ์์ต๋๋ค(ํ ๊ตฌ์ฑ์์๊ฒ ํ์ํ -f
ํ๋๊ทธ ์์). ์กฐํํ๊ฑฐ๋ ์์์ผ ํ ํ์๊ฐ ์์ผ๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์์๋๋ก ์๋ํฉ๋๋ค).
๋ฒ์ 3 ์์ฑ ํ์ผ ์ฌ์ฉ์ด ์ฐจ๋จ๋์์ต๋๋ค.
์ ๋ services.yml
๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค์ ๊ธฐ๋ณธ ๋ ์ด์์์ ์ ์ํ ๋ค์ ๊ฐ๋ฐ ํ๊ฒฝ(๋๋ถ๋ถ ๋ณผ๋ฅจ ์ถ๊ฐ)์ ์ํด dev.services.yml
๋ก ํ์ฅํ์ง๋ง ํ์ฅ์ (DRY) ์ฌ์ฌ์ฉ์ฑ์ ์ข์ํฉ๋๋ค. ์ถ๊ฐํ์ต๋๋ค. ๊ฑฐ๋ ์ฐจ๋จ๊ธฐ๋ ์๋์ง๋ง ํ์ ๊ธฐ๋ฅ์ด ์๋ ํ ๋ฒ์ 3์ผ๋ก ์ด๋ํ๋ ๊ฒ์ ๋ง์ ์ ์์ต๋๋ค.
๋๋ v2.1 'ํ์ฅ' ์๋ฃจ์ ์ ๋ ์ ์ ํ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ ๊ฒ์ ๋ฐ๋ํ์ง ์์ต๋๋ค. ์ถ์ ์๋น์ค์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๊ธฐ์ ๋ ์์ ํ๊ณ ๋ ๊ฐ๋ ฅํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด (์ถ์์ ์ด๊ธฐ ๋๋ฌธ์) ์ถ์์ ์ธ ๊ธฐ๋ณธ ์๋น์ค๊ฐ ํธ์คํธ ๋ถ๋ถ์ ์ ์ํ์ง ์๊ณ ์๋น์ค์ ํ์ํ ๋คํธ์ํฌ ๋๋ ๋ก์ปฌ ๋ง์ดํธ ์ง์ ์ ์ ์ํ๋ ์ถ์ ๋ณผ๋ฅจ/๋ง์ดํธํฌ์ธํธ/๋คํธ์ํฌ๋ฅผ ์ง์ํ๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค. ๋ง์ดํธ/๋ณผ๋ฅจ ๋ฐ ๋คํธ์ํฌ์ ํธ์คํธ ๋ถ๋ถ์ ํธ์คํธ/์คํ ์ด์ง ํ๊ฒฝ์ ์ ์ ํ ๊ฒ์ผ๋ก ๋งคํํฉ๋๋ค.
๊ทธ๊ฒ์ ๋ด๊ฐ ์๋ ํ 'ํ์ฅ'์ผ๋ก ์ง๊ธ ํ ์ ์๋ ์ผ์ ์์ด๋ฉฐ ๋ช ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค ๊ฒ์ ๋๋ค.
ํ์ฅ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ๋ ๊ฒ์ ์ ํ ๋์์ด ๋์ง ์์์ต๋๋ค. ๋งคํ๋ ๋์ผํ ๋ณผ๋ฅจ, ํ๊ฒฝ ๋ณ์ ๋ฐ ๋ ์ด๋ธ ์ธํธ๋ก ์์๋๋ ๋ง์ ์น ์๋น์ค๊ฐ ์์ต๋๋ค. ๊ทธ๋ค์ ๋ํ ๋์ผํ ๊ฑด๊ฐ ํ์ธ ์ ์ฑ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํฌํธ๋ ๋งํ ๊ฒ๋ ์์ต๋๋ค. ์ฌ๋ฌ -f ์ต์ ์ ์ฌ์ฉํ์ฌ ์์ฑ ํ์ผ์ ๊ฒฐํฉํ๋ ๊ฒ์ ๋์ผํ ํธ์คํธ์์ ์ฌ๋ฌ ํ๋ก์ ํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ ์ง๋ฃจํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค.
@shin- ์ด๊ฒ์ 3.2 ์คํค๋ง์์ ๋ค์ ๊ฐ์ ธ์ฌ๊น์?
extends
๋ฅผ ํ์ผ ํ์์ผ๋ก ๋๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. ์ ๋ ์ฌ๋ฌ ํ๋ก์ ํธ์์ ์ถ์ ์๋น์ค๋ฅผ ๋์ฑ ๊ตฌ์ฒดํํ๋ ๋ฐ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ฌ๋ฌ -f
์ต์
์ด ๊ฑฐ์ ์ฒญ๊ตฌ์์ ๋ง๋๋ค๋ ๊ฒ์ ์ดํดํ์ง๋ง ํญ์ ์๋ํ์ง๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ๋ ์ถ์ ์๋น์ค์ ์ด๋ฆ์ ํ์ฌ ์งํ ์ค์ธ ํ๋ก์ ํธ์ ์ปจํ
์คํธ์์ ๋ ์๋ฏธ ์๋ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๊ฒ์ ์ฌ๋ฌ -f
์ต์
์์ ๋ฐ์ํ๋ ์ฌ์ ์๊ฐ ์ง์ํ์ง ์๋ ๊ฒ์
๋๋ค.
ํ์ผ์์ ์ถ์ ์๋น์ค๋ฅผ "์ธ์คํด์คํ"ํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ธ ํ ์ ํํ extends
์์ด๋ ์๊ด ์์ต๋๋ค.
๋๋ ๊ณตํต ์๋น์ค ํ์ผ๊ณผ ๊ทธ๊ฒ์ ํ์ฅํ๋ ๋ง์ ์๋น์ค๊ฐ ์๋ ์ค์ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋๋ถ๋ถ ๋ณผ๋ฅจ์ ๋ณ๊ฒฝํ๋ฏ๋ก extends
๊ธฐ๋ฅ์ ์์กดํ๊ณ ๋ด ์ค์ ์ ์ค๋ช
ํ๋ ๋ค๋ฅธ ์ข์ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
--frustrated
+1
docker-compose ํ์ผ์ ๋ณํฉํ๋ผ๋ ๊ถ์ฅ ์ฌํญ ๋ค์ ์๋ ๋
ผ๋ฆฌ๋ฅผ ๋ณผ ์ ์์ง๋ง ์ฌ๋ฌ ํ๋ก์ ํธ์์ ๊ฐ๋ฐ ์๋น์ค ํ ํด๋ก์ง๋ฅผ ์ ์ํ๋ ์ฝ๋๋ฅผ ๋ณต์ ํ๋ ์์ด๋์ด๋ ๋ง์์ ๋ค์ง ์์ต๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ด๋ค ๊ฒฝ์ฐ์ ํฌํจํ ์๋น์ค๋ฅผ ๊ธฐ์ตํ ํ์๊ฐ ์๋๋ก ์ ์คํฌ๋ฆฝํธ์ ํจ๊ป -f ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ง๊ธ ์ฌ์ฉํ ๊ฒ์
๋๋ค.
๊ตฌ์ฑ ๊ตฌ์กฐ๋ฅผ ๋ ์ ๋ถํดํ ์ ์๋๋ก ์ฌ๊ธฐ์์ ๋ง์กฑ์ค๋ฌ์ด ์๋ฃจ์ ์ ์ฐพ์ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
๋ด ์ฌ์ฉ ์ฌ๋ก ๋ชฉ๋ก์ ๋งจ ์์๋ ๊ตฌ์ฑ ๊ด๋ฆฌ ์๋น์ค๋ฅผ DRYupํ๋ ๊ฒ์ ๋๋ค. v3.0์ด๋ฉด 'ํ์ฅ'์ ํ์ฉํ ์ ์์ ๊ฑฐ๋ผ๊ณ ์๊ฐํ์ต๋๋ค. v2๋ก ๋์๊ฐ๊ณ ์ถ์ง ์์ต๋๋ค... ๊ทธ๋ฆฌ๊ณ -f ํ๋ก์ธ์ค ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ์ํ์ง ์์ต๋๋ค.
์ผ, ์ด๊ฑฐ ์์ ์์ํ ์ฌ๋ ์์ด? ์ถ์ ํ PR์ ์ฐพ์ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์๋ ์ฐ๋ฆฌ๋ฅผ ์ํด ๋ง์ ๊ฒ์ ๋จ์ํํ ๊ฒ์ ๋๋ค(์์์ ์ค๋ช ํ ๊ฒ๊ณผ ๋งค์ฐ ์ ์ฌํ ์ฌ์ฉ ์ฌ๋ก).
๋ฒ์ 3์ด ๊ณ ์ ๋์ด ์๊ณ ๊ณตํต ๊ตฌ์ฑ์ ๊ณต์ ํ ๋ฐฉ๋ฒ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ๊ณต์ ํ ์ ์๋ ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํดํนํ์ต๋๋ค. ์ด ์ ๋ณด๋ฅผ ๊ณต์ ํ์ธ์ :))
repo์ readme๊ฐ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์์ ์์ธํ ์ค๋ช
ํ์ง ์๊ฒ ์ต๋๋ค.
๋ชจ๋ ์ฆ๊ฑฐ์ด ์๊ฐ ๋์ธ์โฎ๏ธ
+1
+1
+1
+1ํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค ๐
๊ทธ ๋์, 10^3 ์์๋งํผ ์์ ๋ค๋ฅธ docker noop ์ด๋ฏธ์ง๋ฅผ ์ฐพ์์ต๋๋ค(์ค์ noop์ด ์ด์
๋ธ๋ฆฌ๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์).
๋ถํํ๋ ํด๋น ๋ฆฌํฌ์งํ ๋ฆฌ์๋ ๋ผ์ด์ ์ค๊ฐ ์์ต๋๋ค. ์ด๋ฏธ ํ์ด์ค๋น์์ ์ฃผ์ธ์๊ฒ ๊ธ์ ์ผ๋๋ฐ ์์ง ๋ต์ฅ์ด ์๋ค. ๋ ๋ง์ ์ฌ๋๋ค์ด ๊ทธ์ ๋ํด ๋ฌธ์ํ๋ฉด ๋ผ์ด์ ์ค๋ฅผ ์ถ๊ฐํ ์๋ ์์ต๋๋ค. :)
์ผ๋ถ ํ์ฅ ์ฌ์ฉ ์ฌ๋ก(๋จ์ผ ํ์ผ ๋ด)์ ๋์์ด ๋ ์ ์๋ ๊ฒ์ YAML ์ต์ปค์ ๋ํ ์ง์์ ๋๋ค. https://learnxinyminutes.com/docs/yaml/
JSON ์คํค๋ง๊ฐ service must be a mapping, not a NoneType.
์ ํจ์ฑ ๊ฒ์ฌ์ ์คํจํ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
์๋ ํ์ธ์, @grayside , yaml ์ต์ปค๋ ์ ์ด๋ ์ ์๊ฒ๋ ์๋ํฉ๋๋ค. ๋ด๊ฐ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์ ๋ด ์๊ฒฌ์ ์ฐธ์กฐํ์ญ์์ค.
์ข์, ํ์ง๋ง ๋ ์๋น์ค๋ฅผ ์ฌ์ฉํ๊ธฐ์๋ ๋๋ฌด ์ฌํ๋ค ์๋?
ํนํ env vars์ ๊ฒฝ์ฐ ํด๋น env vars๊ฐ ์ฒ๋ฆฌํ๋ ๊ฐ์ ์ข ๋ฅ๋ ๋ฌด์์ ๋๊น? ๋น๋ฐ์ ๊ดํ ๊ฒ์ด๋ผ๋ฉด swarm secrets ๊ธฐ๋ฅ(๋๋ ๋ค๋ฅธ ๋น๋ฐ ์๋ฃจ์ )์ ์ฌ์ฉํ์ญ์์ค. ์ค์ ์ ๊ดํ ๊ฒ์ด๋ผ๋ฉด ๋๋ถ๋ถ์ ์ค์ ์ ์ฑ/์๋น์ค์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ์๋น์ค ๊ฐ์ ๊ณต์ ํ ์๋๊ฐ ์๋๋๋ค.
์๋น์ค ๊ฐ์ ์ค์ ์ ๊ณต์ ํด์ผ ํ๋ ๊ฒฝ์ฐ ๋๋ถ๋ถ ๋์ผํ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์คํํ์ง๋ง ๋ฐํ์ ๋ชฉ์ /์์ (์๋น์, ์์ฐ์, http ์์ ์ ๋ฑ)์ด ๋ค๋ฅผ ๋์ ๋๋ค.
์ค์ ์ ๊ดํ ๊ฒ์ด๋ผ๋ฉด ๋๋ถ๋ถ์ ์ค์ ์ ์ฑ/์๋น์ค์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ์๋น์ค ๊ฐ์ ๊ณต์ ํ ์๋๊ฐ ์๋๋๋ค.
๋๋ ๋์ํ์ง ์๋ ๊ฒฝํฅ์ด ์๋ค. ํ์ฌ ์์ ์ค์ธ ํ๋ก์ ํธ์์ ๋ณผ๋ฅจ์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
# Volume paths
environment:
- &volume_a volume-a:/usr/share/my_project/volumes/volume-a
- &volume_b volume-b:/usr/share/my_project/volumes/volume-b
- &volume_c volume-c:/usr/share/my_project/volumes/volume-c
- &volume_d volume-d:/usr/share/my_project/volumes/volume-d
์ด์ ๋ค์๊ณผ ๊ฐ์ด ๋ณผ๋ฅจ์ ์ง์ ํ ์ ์์ต๋๋ค.
volumes:
- volume-a:
- volume-b:
- volume-c:
- volume-d:
services:
some-service:
image: some-image
volumes:
- *volume_a
- *volume_b
some-other-service:
image: some-other-image
volumes:
- *volume_b
- *volume_c
some-third-service:
image: yet-another-image
volumes:
- *volume_a
- *volume_b
- *volume_c
- *volume_d
์ด๋ ๊ฒ ํ๋ฉด ํ์ฌ ์๋ ์ปจํ ์ด๋์ ๋ํด ์๊ฐํ ํ์ ์์ด ๋ค๋ฅธ ๋ณผ๋ฅจ์ ๋ ์ฝ๊ฒ ํ์ํ ์ ์์ต๋๋ค. ์ํธ, ์ด๊ฒ์ docker-compose ์ค์ ์ ๋ณด๋ค ์ผ๊ด๋๊ณ ์ฌ์ฉ ๋ฐ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋๋ค.
์, @JanNash๋ฅผ ์ดํดํ์ง๋ง ์๋ ์์์๋ noop ์๋น์ค๊ฐ ์์ต๋๊น?
๊ทธ๋ฌ๋ ์ต์ปค๋ ๋ง์ ๊ฒฝ์ฐ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
์ ๊ฒฝ์ฐ์๋ ๋์ผํ ํ๋ก์ ํธ์ ๋ํด ์ฌ๋ฌ ํ๊ฒฝ์ ์ง์ํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ์ฌ๊ธฐ์์ ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ๋น๊ณ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๊ฐ๋ฐํ ๋๋ devel.yaml
๋ฅผ ์ฌ์ฉํ์ง๋ง ํ๋ก๋์
์์๋ prod.yaml
ํฉ๋๋ค. test.yaml
์์ต๋๋ค. ๋ชจ๋ common.yaml
์์ ์์ํ๊ณ .env
ํ์ผ์์ ๋ช ๊ฐ์ง ๊ณตํต ๋ณ์๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๊ฐ๊ฐ ๊ณ ์ ํ ํน์ฑ์ด ์์ต๋๋ค.
์ด ๊ฐ๋จํ ๋ถ๋ฆฌ๋ฅผ ํตํด ๋งค์ฐ ๋ฏผ์ฒฉํ๊ณ ์ ์ฐํ DevOps ํ์ดํ๋ผ์ธ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ๋ชจ๋ ์ฌ๋์ ์ฌ์ฉ ํ๊ฒฝ์ ๋ฐ๋ผ ์ฝ๊ฐ์ ์กฐ์ ๋ง ํ๋ฉด ์ฌ๋ฌ ๋จ๊ณ์์ ๋์ผํ ์ฝ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํ์ผ ํ์ v3์ ์์ฑํ๊ธฐ ์ํด ์ด๋ํ๋ ค๊ณ ํ์ง๋ง Swarm๊ณผ DRY ์ค์์ ๊ฒฐ์ ํ ๋ ์ง๊ธ์ DRY๋ฅผ ์ ํํ์ง๋ง ์ธ์ ๊ฐ๋ Swarm์ด ํ์ํ๊ณ ๋ ๊ธฐ๋ฅ์ด ๋ค์ ์ง์๋๋ ๋ ์ด ์ค๊ธฐ๋ฅผ ๋ฐ๋๋๋ค... โบ๏ธextends
๋ฟ๋ง ์๋๋ผ .env
๋ ์ง์๋์ง ์์ผ๋ฏ๋ก ์ง๊ธ์ ์ ์ง ๊ด๋ฆฌ์ ์
๋ชฝ์ด ๋ ๊ฒ์
๋๋ค( .env
๋ถ์กฑ์ผ๋ก ์ธํด ๋ ๋ง์ด
... ๋๋ ์ต์ํ DRY-ful ์๋ฃจ์
์์ ์ ํจํ DRY-less ํ์์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. docker-compose bundle
๋ผ๊ณ ์๊ฐํ๋๋ฐ ์ง๊ธ ๋น์ฅ์ ํ๊ธฐ๋ ์ด๋ช
์ธ ๊ฒ ๊ฐ์ต๋๋ค...
... ๋๋ ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฒ์ ๋ง๋๋ ๋ค๋ฅธ ๋๊ตฌ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค(์ ๋ ๊ฐ๋ฅํ ์ปจํ ์ด๋๋ฅผ ์ฃผ์ํ๊ณ ์์ต๋๋ค). ๊ทธ๋ฌ๋ ํ์คํ ์ด๊ฒ์ "์์ "์ด ์๋๋๋ค.
https://github.com/moby/moby/issues/31101#issuecomment -301212524์ ๋งํฌ์๋ YAML ์ต์ปค์ ์์ ์์ ์ ํจ๊ป README๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ค๋ ๋ค์ ํ์ธํ๊ณ ๋ค์ ์๋ํ๋ฉด ์ ์๋ํฉ๋๋ค. ๋ด๊ฐ ๋ค๋ฅด๊ฒ ๋ฌด์์ํ๊ณ ์๋์ง ํ์คํ์ง ์์ต๋๋ค.
@JanNash ๐
@Yajo ๊ทํ์ ๋ง์ ๋ฃ๊ณ ๋งํ๋ฏ์ด docker/moby/docker-compose(์ ํํ ์ฐธ์กฐ๊ฐ ๋ฌด์์ด๋ )์์ ์ ๊ณตํ๋ ์ฐ์ํ ๊ธฐ๋ณธ ์ ๊ณต DRY ์๋ฃจ์ ์ด ์์ผ๋ฉด ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ฉฐ ํจ์ฌ ๋ ์ข์ ๊ฒ์ ๋๋ค. . ๊ทธ๊ฒ๊ณผ ๋ณ๊ฐ๋ก ๋๋ docker compose๊ฐ ๊ฝค ๋ง์กฑ์ค๋ฝ๊ธฐ ๋๋ฌธ์ ๋นจ๋ฆฌ ์ค๊ธธ ๋ฐ๋๋๋ค ๐
~ .env ์ง์์ ๋์น๊ธฐ ์ํด ํด๊ฒฐ ๋ฐฉ๋ฒ๋ ํดํนํ์ต๋๋ค. ์๋ก ๋ค๋ฅธ ํ๊ฒฝ(์ง๊ธ์ ๋ก์ปฌ ๊ฐ๋ฐ ๋ฐ ์๊ท๋ชจ ๊ฐ๋ฐ ์๋ฒ)์์ ์๋ก ๋ค๋ฅธ ํ๊ฒฝ ๋ณ์ ์งํฉ(์: ์ข
์์ฑ ๋ฐ ์ด๋ฏธ์ง ๋ฒ์ /ํ๊ทธ)์ ์ง์ํ๊ธฐ ์ํด local.env
๋ ํ์ผ์ ์ฌ์ฉํฉ๋๋ค development.env
๊ทธ๋ฆฌ๊ณ docker-compose <command>
๋ด ๋ช
๋ น์ ์คํํ๋ ๋์ ์ด์ ์ ํด๋น .env ํ์ผ์ ๋ด ์
ธ์ ์์ฑํ๊ฑฐ๋ ๋ค์๊ณผ ๊ฐ์ด ์คํํฉ๋๋ค. (. local.env && docker-compose <command>)
. ์ฌ์ ํ ํดํน์ด์ง๋ง ์ง๊ธ์ ์ด๊ฒ์ ๋งค์ฐ ๋ง์กฑํฉ๋๋ค.~
์ฆ๊ฑฐ์ด ์๊ฐ ๋์ธ์ ์ฌ๋ฌ๋ถ ๐ถ
2๋ฐฐ์ ๊ท๋ชจ์ผ ์๋ ์์ต๋๋ค. :D
@JanNash ๊ธฐ๋ค๋ ค! .env
๋ 3
์์ ๋ ์ด์ ์ง์๋์ง ์์ต๋๊น?
์ ๋ ์ฌ์ค ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋๊ธ์์ ๊ทธ๋ ์ง ์๋ค๋ ๊ธ์ ์ฝ์์ต๋๋ค.
์ ๋ autoenv๋ฅผ ๊ตฌํํ ๋ autoenv์ ๋ํด ๋ชฐ๋๊ธฐ ๋๋ฌธ์ ์ฃผ๋ก local.env ๋ฐ development.env ํ๋ก์์ ๋ฅผ ์ฌ์ฉํด ์์ต๋๋ค. D
ํผ๋์ ๋๋ ค ์ฃ์กํฉ๋๋ค.
์, @Yajo ๋ ์ด ๋๊ธ ์์ ๋๋ฝ๋ .env ์ง์์
@Yajo ์์ธํ ์ค๋ช
ํด ์ฃผ์๊ฒ ์ต๋๊น?
์ ๋ฏธ์, ๋ด ์๋ชป์ด์ผ. ์๋ํ์ง ์๋ ๊ฒ์ด ์๋๋ผ ์ด์ ๊ณผ ๊ฐ์ด ์๋ ๊ฐ์ง๋๋ ๋์ env_file: .env
์ง์ ํด์ผ ํฉ๋๋ค . ์๋ ๋ฌธ์ ๋ก ๋์๊ฐ์.
extends
์๋ฌด๋ฐ๋ ๋จ์ด๋จ๋ฆฌ๋ ํ ๋ก ์ด ์์ต๋๊น? ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ ๊ณตํ๊ธฐ ์ ์ ์ด ๊ธฐ๋ฅ์ด ๊ฝค ๋ง์ด ์ฌ์ฉ๋ ๊ธฐ๋ฅ์ด๋ผ๋ ๊ฒ์ ์ ์ดํดํ๊ณ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์์ธํ ์ฝ์ด๋ณด๊ณ ์ถ์ต๋๋ค.
์๋ ํ์ธ์, ํ ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค - ์ธ์ ? "ํ์ฅ" ์ง์์ด v3์์ ์ธ์ ๋ค์ ์์๋ฉ๋๊น?
@JanNash ๋น์ ์ ๊ทธ๋ณด๋ค ํจ์ฌ ์์
๋๋ ์ง๊ธ Swarm์์ ํ์ฅ์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
๋์ผํ ๊ฒ์ ํฌํธ์ 1๊ฐ์ ์ถ๊ฐ ํ๊ฒฝ ๋ณ์๊ฐ ์๋ ์๋น์ค์ ํ๋์ ์ปจํ
์ด๋๋ก ๋์ผํ ์๋น์ค๋ฅผ ์์ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น?
์ค์ ์คํ ๋ฐฐํฌ์์ ํ์ฅ ์ง์์ ์ํด +1
์๋
ํ์ธ์,
์ฌ๋ฌ git ๋ฆฌํฌ์งํ ๋ฆฌ(๊ฐ๊ฐ docker-compose ํ์ผ์ด ์์)์ ๋ถ์ฐ๋ ๋ง์ดํฌ๋ก์๋น์ค ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๊ณ ์์ต๋๋ค.
๋ฐฐํฌ๋ ๊ฐ ์๋น์ค๋ฅผ ํ์ฅํ๋ ํ๋์ "๋ฃจํธ" docker-compose ํ์ผ์ ์ํด ์งํ๋ฉ๋๋ค. ์ฐ๋ฆฌ์๊ฒ ์ด extends
๊ธฐ๋ฅ์ ์คํ ๋ฐฐํฌ์ ์ค์ ๋ก ํ์ํฉ๋๋ค.
๋ฐ๋ผ์ Swarm ์คํ ๋ฐฐํฌ์์ ์ง์์ ํ์ฅํ๋ ค๋ฉด +1๋ ํ์ํฉ๋๋ค.
๊ฐ์ฌ ํด์.
์์ ์๋ฃจ์
์ผ๋ก YAML ๋จ์ ์์( &default
, <<: *default
)์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
version: '3'
services:
worker: &default
build: .
command: bundle exec rake jobs:work
env_file:
- .env
volumes:
- .:/app
depends_on:
- db
- redis
links:
- db:postgres
web:
<<: *default
command: bundle exec puma -C config/puma.rb -p 3000
ports:
- "3000:3000"
spring:
<<: *default
command: bundle exec spring server
๋ฌผ๋ก extends
๊ธฐ๋ฅ์ด ๋ ์ข์ต๋๋ค.
๋ค๋ฅธ ํ์ผ์ ํ์ฅํ๋ฉด ์ด๋ป์ต๋๊น?
Yaml์๋ ํ์ผ ํ์ฅ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
Docker ๊ธฐ์ฌ์์ ์ด ๊ธฐ๋ฅ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ฌ๋์ ์์ ์ธ๊ฐ์? ๊ทธ๋ ์ง ์๋ค๋ฉด ๋น์ทํ ๊ณํ์ด ์์ต๋๊น? ์๋๋ผ๋ฉด ์..?
@quolpr, ๋๋ ๋น์ ์ "YAML์ ๊ฐ๋จํ ์์"์ฝ๋๊ฐ ๋์ฒดํ์ง ์์ต๋๋ค ๋๋ ค์ extends
๋๋ถ๋ถ์ ๊ฒฝ์ฐ "ํ๋กํ ํ์
"์ดํ (์ฆ, &default
)๋ ํญ์ ๊ฐ์ ๋์ปค ์์ฑ์ ์ํด ํด์๋ฉ๋๋ค worker
๋ผ๋ ์๋น์ค์
๋๋ค. ๋ฐ๋ผ์ a) ์ ์ ์๋์ด์ผ ํ๋ ์๋น์ค, b) ์ํ์ง ์๋ ์๋น์ค.
์ด์จ๋ ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์์๋ ํ๋ฆผ์์ต๋๋ค.
@laugimethods YAML ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
version: '3'
services:
spring:
build: ./app
command: /bin/sh -c "bundle exec spring server"
volumes: &default_volumes
- ./app:/app:delegated
- bundle:/bundle:nocopy
worker:
build: ./app
command: bundle exec sidekiq -v -C config/sidekiq.yml
volumes: *default_volumes
( &default_volumes
๋ฐ *default_volumes
)
๊ทธ๋ฐ๋ฐ ์ extends
๊ธฐ๋ฅ์ด ์ ๊ฑฐ๋์๋์ง ์ ๋ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค ๐ค
์ฐธ๊ณ ๋ก, ๋๋ฝ๋ "ํ์ฅ" ๊ธฐ๋ฅ์ ๋์ฒดํ๊ธฐ ์ํด ์ด์ .yaml
ํ์ผ์ ํฉ์ฑ/๋ณํฉ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
https://github.com/Logimethods/smart-meter/blob/master/README.md#docker -compose
extends ์ํ์ ๊ฐ๋จํ๊ณ ์ฑ์ํฉ๋๋ค. ๋๊ตฐ๊ฐ extends ๋ฅผ ์ํฐ ํจํด์ผ๋ก ๋ณด๋ ๊ฒฝ์ฐ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ๊ทธ๋ฌ๋ ์๋ผ๋ด์ง ๋ง์ญ์์ค.
extends
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋ํ ์ ๊ทผ ๋ฐฉ์์ ๋ํ ๋ช
ํํ ์ค๋ช
์ ์์ฒญํ ์ ์์ต๋๊น? ํนํ Git ํ์ ๋ชจ๋์ ํฌํจ๋ ํ์ผ์์ ์์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ ๋คํธ์ํน ๋ฐฐ์ ๋ฑ์ ์ฒ๋ฆฌํ๋ ๋ฉํ ํ๋ก์ ํธ์ ์ ์๋ฅผ ํ์ฉํ ๋ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํฉ๋๋ค. ์ฌ๋ฌ docker-compose.yml
ํ์ผ์ ์ง์ ํ ์ ์๋ค๋ ๊ฒ์ ์ ์๊ณ ์์ง๋ง ์ฌ์ ์ํ๋ฉด extends
์ฌ์ฉํ์ฌ ์์ค ์ ์ด์ ์ฐ๊ฒฐํ ์ ์๋ ๋์ ๋ช
๋ น์ค์์ ์ํธ ์ฐ๊ฒฐ์ ์ง์ ํด์ผ ํฉ๋๊น? ์๋๋ฉด v3์ ์ด๋๊ฐ์์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋์ณค์ต๋๊น?
์ฌ๋ฌ ํ๋ก์ ํธ์์ extends
๋ฅผ ๋ง์ด ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํ๊ฒฝ๊ณผ ๋ค๋ฅธ ํธ์คํธ์ ๋ํ ๊ณตํต ์๋น์ค ์์ฑ ์ธํธ๋ฅผ ์์ํฉ๋๋ค(์ฝ๊ธฐ: extends
๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํ์ผ์์ ์์ํจ).
extends
ํค์๋ ์ ๊ฑฐ๋ฅผ ์ฝ๊ณ ๋ฐ์ด์ง ์ฒด์ธ -f
docker compose ํ์ผ์ ํ์๋ก ํ์ง ์๋ ๋์ฒด๋ฌผ์ ์ฐพ์ผ๋ ค๊ณ ์๋ํ ํ extends
๋ฅผ ์ ๊ฑฐํ ์ด์ ๊ฐ ๋ฌด์์ธ์ง ๋งค์ฐ ๊ถ๊ธํฉ๋๋ค.
links
๋ฐ volume-from
์ ๋ฌธ์ ๋ฅผ ์ดํดํ์ง๋ง ๊ธฐ๋ณธ yml ํ์ผ์์ ์ฌ์ฉ์ ์์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ฐจ๋ฅผ ๋ค์ง๋ ๋ฐ ์ต์ํด์ก๋ค๋ ์ด์ ๋ง์ผ๋ก ์ฐจ์ ๋ฐํด๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ _์ด์ฉ๋ฉด_ ๋ถ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ฃ ?
์ถ์ : noop ๋ฐ anchors๋ ํฅ๋ฏธ๋กญ๊ฒ ๋ณด์ด์ง๋ง ๊ฐ์ฅ ๋จ์ํ ํ๋ก์ ํธ์ ๋ถํ์ํ ๋ณต์ก์ฑ์ ์ถ๊ฐํฉ๋๋ค...
์์ฃผ ๊ฐ๋จํ ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
common/common.yml
services:
web:
image: alpine:3.6
build: .
environment:
DOMAIN:
PREFIX:
dev/docker-compose.yml
services:
web:
extends: ../common/common.yml
service: web
ports:
- "8080:8080"
prod/docker-compose.yml
services:
web:
extends: ../common/common.yml
service: web
image: the-prod-image:latest-release
ports:
- "80:80"
- "80:443"
environment:
NEW_RELIC_KEY:
extends
์์ด DRY ์์น์ ์ ์งํ๋ ๋ฐฉ๋ฒ
ํ์ฌ ์ด ๋๋ฌธ์ ๋ฒ์ 2.1์์ ์ ๊ทธ๋ ์ด๋ํ ์ด์ ๊ฐ ์์ต๋๋ค.
@teodorescuserban ,
๋ฐ์ด์ง ์ฒด์ด๋ -f ๋์ปค ์์ฑ ํ์ผ
๊ทธ๊ฒ ๋ญ๊ฐ ๋ฌธ์ ์ผ? docker-compose๋ฅผ ํธ์ถํ๊ธฐ ์ํด ์งง์ ๋ณ์นญ์ ์ฌ์ฉํ์ฌ ๊ณ ์ ํ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๋ค์ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
services:
web:
image: alpine:3.6
build: .
environment:
DOMAIN:
PREFIX:
services:
web:
ports:
- "8080:8080"
services:
web:
image: the-prod-image:latest-release
ports:
- "80:80"
- "80:443"
environment:
NEW_RELIC_KEY:
docker-compose -f common/common.yml -f dev/docker-compose.yml -p myproject up --build
docker-compose -f common/common.yml -f prod/docker-compose.yml -p myproject up --build
๊ทธ ๊ธฐ๋ฅ์ ๋ชฐ๋์ต๋๋ค. CLI๋ฅผ ๐ฉ๋ก ๋ง๋ค์ง๋ง ์๋ํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ด extends
๋ํ ๊ณต์์ ์ธ ๋์ฒด ๊ฐ ๋๋ค๋ฉด ๋ ์ฝ๊ฒ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ฅผ ๋ค์ด:
docker-compose.yml
version: "3" # or whatever
extend:
- ./common/common.yml
- ./dev/docker-compose.yml
services: # Not required now
# etc.
์ด๋ ๊ฒ ํ๋ฉด ํ์ํ ๋ชจ๋ ์์
์ ์ํํ๋ ๋จ์ผ docker-compose.yml
ํ์ผ์ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค.
์ ์ฉํ ๋์์ COMPOSE_FILE
ํ๊ฒฝ ๋ณ์์์ ์ฌ๋ฌ ์์ฑ ํ์ผ์ ์ง์ํ๋ ๊ฒ์
๋๋ค.
@์ผ์กฐ
์ ์ฉํ ๋์์ COMPOSE_FILE ํ๊ฒฝ ๋ณ์์์ ์ฌ๋ฌ ์์ฑ ํ์ผ์ ์ง์ํ๋ ๊ฒ์ ๋๋ค.
https://docs.docker.com/compose/reference/envvars/#compose_file์์ :
์ด ๋ณ์๋ ๊ฒฝ๋ก ๊ตฌ๋ถ ๊ธฐํธ๋ก ๊ตฌ๋ถ๋ ์ฌ๋ฌ Compose ํ์ผ์ ์ง์ํฉ๋๋ค(Linux ๋ฐ macOS์์ ๊ฒฝ๋ก ๊ตฌ๋ถ ๊ธฐํธ๋
:
, Windows์์๋;
). ์:COMPOSE_FILE=docker-compose.yml:docker-compose.prod.yml
. ๊ฒฝ๋ก ๊ตฌ๋ถ์๋COMPOSE_PATH_SEPARATOR
์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ํ ์๋ ์์ต๋๋ค.
@dermeister0 https://github.com/ImmobilienScout24/yamlreader ์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ํ์ผ์ ์๊ตฌ์ ์ผ๋ก ๋ณํฉํ ์๋
> yamlreader common/common.yml prod/docker-compose.yml > docker-compose-prod.yml
> docker-compose -f docker-compose-prod.yml -p myproject up --build
> cat docker-compose-prod.yml
services:
web:
build: .
environment:
DOMAIN: null
NEW_RELIC_KEY: null
PREFIX: null
image: the-prod-image:latest-release
ports:
- 80:80
- 80:443
@dermeister0 ์ ์ extends
์ฌ์ฉํ๋ฉด ๋ฐ์ด์ง ์ฒด์ธ ๋ฐฉ์์ ์ ํํ ์์์ผ ํ ํ์๊ฐ ์์ต๋๋ค. ๋ ์์ ์ ์ํด ๊ทธ๋ ๊ฒ ํ ์๋ ์์ง๋ง ์ด ์๋ฃจ์
์ ์ฌ๋ํ๋ ๊ฐ๋ฐ์์๊ฒ ์ ์ฉํ ์๋ ์์ต๋๋ค.
๊ทธ๋ฌ๋ COMPOSE_FILE
env ๋ณ์์ ์ฌ๋ฌ ๊ฐ์ด ํฌํจ๋ ์ ์๋ค๋ ๊ฒ์ ์์ง ๋ชปํ์ต๋๋ค. @gsong ๊ฐ์ฌํฉ๋๋ค! ๊ทธ๊ฒ์ ๊ต์ฅํ๊ณ ๊ทธ๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค ( .env
ํ์ผ์์ ์ ์ํฉ๋๋ค). ์ฌ๊ธฐ์๋ ํ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ธฐ๋ณธ/๊ณตํต ํ์ผ์๋ ํ์ํ์ง ์์ ์๋น์ค๊ฐ ์์ ์๋ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์น ์ปจํ ์ด๋๋ฅผ ์ ์ํ๋ ํ๋ซ ๊ณตํต ํ์ผ์ ์๋ก ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์คํ ์ด์ง์์๋ ๋ชจ๋ ํจ๊ป ๋ญ์ณ์ง๊ธฐ๋ฅผ ์ํ์ง๋ง ํ๋ก๋์ ์์๋ db ๋ฐ ์น์ฉ์ผ๋ก ๋ณ๋์ ํธ์คํธ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
๋ํ ๊ธฐ๋ณธ์ ์ผ๋ก docker-compose.override.yml์ด ๋ก๋๋ฉ๋๋ค.
https://docs.docker.com/compose/extents/#understanding -multiple-compose-files
๋ฒ์ 3.3์์ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
docker-compose.yml
์ ์ผ๋ฐ์ ์ธ ๊ตฌ์ฑ ์ต์
๊ณผ ์๋น์ค๋ฅผ ๋ฃ์ต๋๋ค.docker-compose.override.yml
๋ฅผ ์ฌ์ฉํ์ญ์์ค.docker-compose.staging.yml
๋ฅผ ์ฌ์ฉํฉ๋๋ค.์ฐธ๊ณ : ํ๋ก๋์ ํ๊ฒฝ์์๋ Docker๋ฅผ ์คํํ์ง ์์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด docker-compose build
์ฌ์ฉํ์ฌ ๋ก์ปฌ์์ ์ฝ๊ฒ ๋น๋ํ ์ ์์ผ๋ฉฐ ์คํ
์ด์ง์ ๋ฐฐํฌํ ๋ ๋ค์์ ์ฌ์ฉํฉ๋๋ค.
docker-compose -f docker-compose.staging.yml -f docker-compose.yml build
Apache๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๊ฐ๋ฐ ๋ฐ ์ค๋น๋ฅผ ์ํ ๋ณ๋์ ๊ฐ์ ํธ์คํธ ํ์ผ์ด ์์ต๋๋ค. ๋๋ ๋ค๋ฅธ ํ์ผ์ ๊ฐ๋ ๊ฒ์ ํผํ๊ธฐ ์ํด ๊ฝค ๋ง์ ์๊ฐ์ ๋ณด๋์ต๋๋ค. ๊ฒฐ๊ตญ ์ ํจํ ์ ์ผํ ์ ๊ทผ ๋ฐฉ์์ <IfDefine>
๋ฐ ํ๊ฒฝ ๋ณ์(yml ํ์ผ์ ํ๊ฒฝ ์น์
์์ ์ค์ )๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฅผ ๋ค์ด ssl ๊ตฌ์ฑ์ ํฌํจํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ TLD์ ๋๋ฉ์ธ ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก www.example.local http://www.example.local/ :8080 ๋ฐ www.staging.example.com http://www.staging.example.com ๊ณผ ๊ฐ์ ๊ฒ์ ๊ฐ์ง ์ ์์ต๋๋ค
๊ฒฝ๋ก๋ ๋ชจ๋ ์น์ฒ์ด๋ฏ๋ก ์ปจํ ์ด๋๋ ๋ชจ๋ ํ๊ฒฝ์์ ์๋ํฉ๋๋ค.
๋ด 2์ผํธ
-ํ๋ฆฌํฌ
์ ๊ฒฝ์ฐ์๋ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ์ต๋๋ค.
์ ๊ฐ ๋ชฐ๋๋ https://github.com/moby/moby/issues/31101#issuecomment -329482917 ๊ณผ https://github.com/moby/moby/issues/31101#issuecomment -329512231 ๋๋ถ์, ์ด์ ๋ค๋ฅธ ์คํค๋ง๋ฅผ ์ฌ์ฉํ์ฌ v3์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
๋ํ env ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๋ชจ๋ ํดํน์ ์ํํ ์ ์์ผ๋ฏ๋ก ์ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. ๊ฐ์ฌ ํด์! ๐ (์ฃ์กํฉ๋๋ค. ๋ถ๋ง์ ์ ๊ธฐํ๊ธฐ ์ ์ ์ ๋ฌธ์๋ฅผ ์ ๋๋ก ์ฝ์์ด์ผ ํ์ต๋๋ค).
์ถ์ : ๊ทธ๋๋ extends
๋ ๋๋๋ ค ๋ฐ์ ์ ์๋ ์ข์ ์ผ์ด์ง๋ง ์ ์ด๋ ์ฐ๋ฆฌ์๊ฒ๋ ๊ณต์ ํ ๋์์ด ์์ต๋๋ค. ๐
@shin- ๋จผ์ extends
๊ธฐ๋ฅ์ด 3.0
๋๋ฝ๋ ๊ฒ์ ๋ณด๊ณ ๋งค์ฐ ์ค๋งํ์ง๋ง YAML ์ต์ปค(์: https://github.com/JanNash/docker-noop)๋ ์ถฉ๋ถํ ๊ต์ฒด ์ด์.
์ ์ผํ ๊ฒ์ ์์ ์์ ๊ฐ์ด docker-compose.yml
ํ์ผ์ ์ ํจํ ์น์
์ ์ต์ปค๋ฅผ ๋ฃ์ด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
(์ต์์) templates
์์ฑ ๋๋ GitLab๊ณผ ๊ฐ์ ์จ๊ฒจ์ง ํค๋ฅผ ๊ฐ์ ธ์ ์ต์ปค๋ฅผ ์ ์ํ๋ ๋ฐฉ์์ ๋ณด๋ค ์ ์ฐํ๊ฒ ํ ์ ์์ต๋๊น?
@schmunk42 ๋ https://github.com/docker/cli/pull/452๋ฅผ ์ดํด๋ณด์ญ์์ค.
docker-compose.override.yml์ ์ฌ์ฉํ ๋์ ๋ฌธ์ ๋ ํฌํจํด์ผ ํ๋ ์ฌ์ ์ ์ ํ๊ณผ ์ฌ์ ์ ๊ณ์ธต์ด ํ๋๋ง ์๋ค๊ณ ๊ฐ์ ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ๋ก์ปฌ ๊ฐ๋ฐ์ ๊ณตํต์ ์ธ ํน์ ๋์์ ์ํ์ง๋ง ๊ฐ๋ฐ์๊ฐ Windows, OSX ๋๋ Linux๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ ๋ฏธ๋ฌํ๊ฒ ๋ฌ๋ผ์ผ ํ ์๋ ์์ต๋๋ค. docker-compose v3 ์ปจํ ์คํธ์์ ์ด๋ฅผ ๊ด๋ฆฌ ๊ฐ๋ฅํ๊ฒ ์ ์งํ๊ธฐ ์ํด Linux ์ฌ์ฉ์๊ฐ ์คํ ์ด์ง ํ๊ฒฝ๊ณผ ๋์ผํ ๋์์ผ๋ก ์๋ํ๋๋ก ํ์ต๋๋ค. ์ด๋ ์๋ํ์ง๋ง ๋ค๋ฅธ ๊ฐ๋ฐ์์ ์ฝ๊ฐ ์ฐจ์ด๊ฐ ์์์ ์๋ฏธํฉ๋๋ค.
์ ๋ ๋ก์ปฌ ๊ฐ๋ฐ์ -f
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํผํฉ๋๋ค. ์๋ํ๋ฉด ์ฌ๋์ ์ค์์ ๋งค์ฐ ์ทจ์ฝํ๊ณ ๋๋ฌด ๋ง์ ์ผ์ ๋ํด ํ ๊ธ๋ก ์์กดํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ํ๋์ ํ์ผ์ ์ ํํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ด์ง๋ง ์ฌ๋ฌ ๊ฐ๋ฅผ ์ ํํ๋ ๊ฒ์ ์ ์คํ๊ฒ ๋ถ๊ณผํ์ง ์๋ ๊ฒ์
๋๋ค.
์ฐธ๊ณ ๋ก, ์์์ ์ธ๊ธํ x-
ํดํนํ๊ณ .env
ํ๋ก์ ํธ ํ์ผ์ COMPOSE_FILE
๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ docker-compose ํ์ผ์ ๋ฐ์ด์ง ์ฒด์ธ์ผ๋ก ์ฐ๊ฒฐํ๋ฉด docker- compose.override.yml์ ๋ด๊ฐ ์ง๊ธ๊น์ง ๋ง๋ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
yml ์ต์ปค๋ ๊ฐ๊น์ด ์ฅ๋์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ ๋ฉ์ง ๊ฒ์ ๋๋ค.
x-
ํดํน ์๋ฆ๋ค์์ ๋งค์ฐ ๋ง์กฑํ์ง ์์ง๋ง ๋๋ ๊ทธ๊ฒ์ผ๋ก ์ด ์ ์์ต๋๋ค.
์ ๋ ฅํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
extends
๋ก ์ธํด ๊ฐ์ด ์์ด๊ฐ ๋ง์ด ๋ฐ์ํ๊ณ v3๋ก์ ์ด๋์ ์ฐจ๋จํ๊ฑฐ๋ ํดํน์ ์์กดํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๋ช ๊ฐ์ง ๊ณตํต ์ฌํญ(์: ์
๋ฐ์ดํธ ์ ์ฑ
)์ ์ ๋ฌํ ์ ์๋ "ํ
ํ๋ฆฟ"(๋๋ ์ถ์) ์๋น์ค๋ฅผ ์ ์ํ๋ ๊ธฐ๋ฅ์ ์ข์ํฉ๋๋ค.
์ ๋ extends
๋ก ๋์ปค ์์ฑ ํ์ผ์ ์ฌ์ ์ฒ๋ฆฌํ๊ณ ํ์ฅ์ด ํด๊ฒฐ๋ ๊นจ๋ํ v3 ํ์ผ์ ๋ฑ์ ์ ์๋ ๊ฐ๋จํ golang ํํฐ ์ ํธ๋ฆฌํฐ๋ฅผ ์์
์ค์
๋๋ค.
ํด๊ฒฐ-์์ฑ
(๋๋ docker-compose up)
์ด๊ฒ์ ์ต์ํ ์ผ๋ถ ์ฌ์ฉ ์ฌ๋ก์์ ์๋ํฉ๋๊น / ์ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
@pnickolov ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด
๋๋ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒ์ ์ํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋น์ ๊ณผ ๊ฐ์ ์คํฌ๋ฆฝํธ๊ฐ ๋ ๋ฐ๋์ง ํ ๊ฒ ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฐ๋ฅํ ์ปจํ ์ด๋ (๋๋ ๊ฐ์ธ์ ์ผ๋ก ์ฌ์ฉํ์ง๋ง ์์ง ์ง์ฅ์์๋ ์ฌ์ฉํ์ง ์์)๋ฅผ ์ฐพ๊ณ ์์ต๋๋ค.
extends:
ํค๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ํ ์ ๋ ๊ธฐ์ ๊ฒ์
๋๋ค!
์๊ฒ ์ต๋๋ค extends
๋ํ ๋์์ ์ฐพ์ ๊ฒ ๊ฐ์ต๋๋ค ... ๐
๋ฌธ์ ๋ Moby์ ํ๋ก์ ํธ ๊ด๋ฆฌ๊ฐ ํธํ์ฑ ์ ์ง๋ฅผ ํต์ฌ ์์๋ก ๊ณ ๋ คํ์ง ์๋ ๊ฒ ๊ฐ๋ค๋ ์ฌ์ค์
๋๋ค. ์ ๋ฐฉ ํธํ์ฑ์ ํนํ ํ๋ก๋์
์ ๋ฐฐํฌ๋ ๋๊ท๋ชจ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ด๋ฒ์ํ ์ฑํ์ ํ์์ ์
๋๋ค. extends
์ ๊ฐ์ ํต์ฌ ๊ธฐ๋ฅ์ด ์ ์ง๋๋ค๋ ๋ณด์ฅ์ด ์๋ ๊ฒฝ์ฐ Docker Swarm/Docker EE๋ฅผ ์ด๋ป๊ฒ ์ถ์งํ ์ ์์ต๋๊น? ๐
์ข์ ํํ์ ์ป๊ธฐ๋ ์ด๋ ต๊ณ ์๊ธฐ๋ ์ฝ๋ค...
๊ฐ์ธ์ ์ผ๋ก ์ ๋ v2
๊ตฌ๋ฌธ์์ extends
์ ์ํด ์ฒ๋ฆฌ๋๋ ์์
์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ ์ ์คํฌ๋ฆฝํธ๋ ๊ฐ๋ฅ๊ณผ ๊ฐ์ ๋ ํฐ ์๋ฃจ์
๋ณด๋ค๋ ๋ค์ดํฐ๋ธ YAML ๊ธฐ๋ฅ์ ์์กดํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ์ด์ ์ ๋น์ทํ ๋ฌธ์ ๊ฐ ์์๊ณ ์ฌ๋ฌ .yml ํ์ผ ๋ฑ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ์๋ฃจ์
์ด ์๊ธฐ ์ ์ ์์ฒด ๋ณํ๊ธฐ๋ฅผ ์์ฑํ๊ธฐ ์์ํ์ต๋๋ค. (https://github.com/schmunk42/yii2-yaml-converter-command) - ๊ทธ๋ฌ๋ ๊ทธ๋ ์ง ์์์ต๋๋ค. ์คํ ๊ฐ๋ฅํ ์๋ฃจ์
.
๋ฒ์ ๊ด๋ฆฌ ์ ์ฑ ๊ณผ ํจ๊ป ์ํ๋๋ ๊ฒฝ์ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ๋ ๊ด์ฐฎ์ต๋๋ค. ์ค๋๋ ๋ฌผ๊ฑด์ ์์ํ ๊ฐ์ง๊ณ ๋ค๋ ์๋ ์์ต๋๋ค. ๋น๋ก ์ด๊ฒ์ด ์ฐ๋ฆฌ ์ธก์์ ์ฝ๊ฐ์ ์์ ์ ์๋ฏธํ๋๋ผ๋.
@schmunk42 ๊ธฐ๋ฅ์ ์ค๋จํ๋ ๊ฒ์ ์ข์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํฉ๋๋ค.
๋ถํํ๋ (๋ด ์ฑ
์์) ์ด๋ฌํ ์๊ตฌ ์ฌํญ ์ค ์ด๋ ๊ฒ๋ extends
์ ์ฌ์ฉ ์ค๋จ์ ์ ์ฉ๋์ง ์์ต๋๋ค ...
@laugimethods v3
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
@schmunk42 Swarm ๋๋ฌธ์:
์ต์ ๊ถ์ฅ ๋ฒ์ ์ธ ๋ฒ์ 3.x๋ Compose์ Docker ์์ง์ ์ค์ ๋ชจ๋ ๊ฐ์ ์ํธ ํธํ๋๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์ด๊ฒ์ ๋ฒ์ : '3' ๋๋ ๋ฒ์ : '3.1' ๋ฑ์ผ๋ก ์ง์ ๋๋ฉฐ YAML ๋ฃจํธ์ ํญ๋ชฉ์ ๋๋ค.
docker stack deploy ๋ช ๋ น์ ๋ฒ์ "3.0" ์ด์์ ๋ชจ๋ Compose ํ์ผ์ ์ง์ํฉ๋๋ค.
Btw, ๋ด ์๊ฒฌ์ extends
๋ฟ๋ง ์๋๋ผ ์์ผ๋ก ๋ฐ์ํ ์ ์๋ (๊ณ ํต์ค๋ฌ์ด) ์ฌ์ฉ ์ค๋จ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค...
์, ์ฐ๋ฆฌ๋ ์ค์ ๋ชจ๋ ๋๋ฌธ์ ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค.
๋๋ ์ฒ์์ ์ docker CLI๊ฐ ์ด์ --composer-file
์
๋ ฅ์ ์ฌ์ฉํ ์ ์๋์ง ๋ฌผ์์ต๋๋ค. ๊ทธ๋ฌ๋ docker/swarm
๋ํ ํ์ต์์ (์์ฒด ๊ด๋ฆฌ) ์ค์์์ ์คํ์ ์คํํ๋ ๊ฒ์ ๊ฝค ๋ณต์กํ ์ผ์ฒ๋ผ ๋ณด์ด๋ฉฐ ์ด๊ฒ์ด ์์ง์ผ๋ก ์ฎ๊ฒจ์ง ๋ฐ์๋ ๋ช ๊ฐ์ง ํฉ๋นํ ์ด์ ๊ฐ ์์ต๋๋ค.
์ฌ๊ธฐ์์ ๋ด ๋ฐ๊ฒฌ ์ฌํญ ์ค ์ผ๋ถ๋ฅผ ์ธ๊ธํ์๋ฉด ... v2
์์ v3.4
๊ฒ์ ๊ฒฐ์ฝ ์ฌ์ด ์ผ์ด ์๋๋๋ค.
๋ด ๋ฌธ์ ์ค ์ผ๋ถ:
volumes_from
์ ๊ฐ์ ๋ค๋ฅธ ์ง์๋์ง ์๋ ์ต์
์ด ์์ต๋๋ค. ์ด์จ๋ ์ ๊ฑฐํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ฐํํ๊ธฐ๊ฐ ์ฝ์ต๋๋ค..env
ํ์ผ(์: docker-compose
)์ Docker CLI์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.docker stack deploy -c docker-compose.yml -c docker-compose.override.yml doro
)์ ์ง์ ํ๋ฉด ์ ๋๋ก ์๋ํ์ง ์๋ ๊ฒ ๊ฐ๊ณ ์ค๋ฅ๋ ์์ง๋ง ์ฌ๋ฐ๋ฅด๊ฒ ๋ณํฉ๋์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ํ์ง๋ง docker-compose config
๊ฐ์ ๋ช
๋ น๋ ํ์ธํ์ง ์์ต๋๋ค.v3.4
๊ตฌ๋ฌธ์ ์ง์ํ๋ docker-compose
๋ํ "์ค์นํ๊ธฐ ์ฌ์ด"(์ํํ) ๋ฐ์ด๋๋ฆฌ๊ฐ ์์ต๋๋ค. ๋์ปค ์ฃ์ง์ฒ๋ผ--scope swarm
๋ก ์์ฑํด์ผ ํฉ๋๋ค.์ฐธ์กฐ: @ํธ๋์ฝ๋
์ต์ ๋น๋ ์ฌ์ฉ
์ด์ _extend_ ๋ฐ _noop_ ์ฌ์ฉ์ ๋์ฒดํ๊ธฐ ์ํด ์ด ๊ตฌ์ฑ ํ์ดํ๋ผ์ธ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ฌผ๊ฑด์ ์กฐ๊ธ ๋ ๊ฑด์กฐํ๊ฒ ์ ์ง
์ด๊ฒ์ด ๋๊ตฐ๊ฐ๋ฅผ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
base.yml (๊ณต์ ์ ์, ์ ํจํ yaml ๋ฌธ์์ด๋ฏ๋ก _docker-compose config_๋ฅผ ์ฌ์ฉํ์ฌ ๋ณํฉ ๊ฐ๋ฅ)
version: '3.4'
networks:
net_back:
external: true
base-inject.yml (๊ณต์ ์ต์ปค ์ ์, ๋ถํํ๋ ๋ค๋ฅธ yaml ํ์ผ์์ ์ต์ปค๋ฅผ ์ฐธ์กฐํ ์ ์๊ธฐ ๋๋ฌธ์ base.yml์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋์ foo.yml ์ ํ ์คํธ๋ก ์ฃผ์ ๋ฉ๋๋ค. ์ด ์์ ์ ์ํํ๋ ์ด์์ ์ธ ๋ฐฉ๋ฒ์ ์๋๋๋ค)
x-logging: &logging
driver: json-file
options:
max-size: "50m"
max-file: "2"
foo.yml (์ผ๋ฐ ์คํ ์ ์, base.yml์ ๊ฐ์ฒด ์ฐธ์กฐ, base-inject.yml์ ์ต์ปค ๋ฐ foo-dev.yml ์์ ์ฌ์ ์๋ ๊ฐ์ฒด)
version: '3.4'
[[base-inject]]
services:
foo:
image: ${DOCKER_REGISTRY}/foo:${IMAGE_VERSION}
volumes:
- type: volume
source: "volfoo"
target: "/foo"
networks:
- net_back
logging:
<<: *logging
foo-dev.yml (ํ๊ฒฝ ์คํ
version: '3.4'
services:
foo:
ports:
- "8080:80"
volumes:
volfoo:
name: '{{index .Service.Labels "com.docker.stack.namespace"}}_volfoo_{{.Task.Slot}}'
driver: local
๊ทธ๋ฐ ๋ค์ ๋ฐฐํฌ ๋ช ๋ น:
docker stack rm stack_foo && echo "waiting..." && sleep 3 &&
cat foo.yml | sed -e '/base-inject/ {' -e 'r base-inject.yml' -e 'd' -e '}' > ./foo-temp1.yml &&
export $(sed '/^#/d' ./dev.env | xargs) &&
docker-compose -f base.yml -f ./foo-temp1.yml -f foo-dev.yml config > ./foo-temp2.yml
docker stack deploy --with-registry-auth --prune --compose-file ./foo-temp2.yml stack_foo
3๊ฐ ์ด์์ ํ์ผ ์์ฑ์์ extends
๋ฅผ ๊ฐ๋งํ๋ ์ฌ๋๋ค์ ์ํด baclin
๋ผ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. baclin
์ด๋ฌํ ์ง์๋ฌธ์ ์ ํํํ์ฌ ๋ชจ๋ extends
์ง์๋ฌธ์ ๋ด์ฉ์ผ๋ก ์ฌ๊ท์ ์ผ๋ก ๋์ฒดํฉ๋๋ค. ์ด๊ฒ์ ์ํ ์ํํธ์จ์ด์ด๋ฉฐ, ํ์ฌ Swarm ๋ชจ๋ ๋ฐ ์คํ ๋ฐฐํฌ๋ฅผ ์ง์ํ๋ ์ฝ๋๋ฅผ ์์ฑ ์ค์ด๋ฏ๋ก ์ฝ๋๋ ๋ด ๊ธฐ๊ณ์ ์ผ๋ถ์
๋๋ค. baclin
์ด๊ธฐ ๋ฒ์ ์ ํ๋ซํผ ๋ฐ์ด๋๋ฆฌ๋ ์ฌ๊ธฐ์์ ์ฌ์ฉํ ์ ์ฌ๊ธฐ์์ ์๊ฒฌ์ด๋ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ
์ด๊ฒ์ ์ ๋ง ํผ๋ ์ค๋ฝ์ต๋๋ค!
์ต์ docker ๋ฆด๋ฆฌ์ค( v17.09
) ๋ฐ v17.06
๋ฆด๋ฆฌ์ค ๋ฌธ์์ ๋ํ ๋ฌธ์ ๋ฅผ
$ head -n1 docker-compose.yml
version: '3'
ํ์ง๋ง compose up
์์ต
ERROR: The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.admin_application: 'extends'
extends
ํค์๋๋ฅผ ์ฌ์ฉํ ๋.
๋ํ compose
changelog ์์ extends
์ ๊ฑฐ์ ๋ํ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
์ด์ ๊ทธ๊ฒ์ ๋ฌด์์
๋๊น?!
์ด์ ๊ฐ์ ์ค์ํ ์ ๋ณด๋ github ๋ฌธ์ ์์ ์ฐพ๊ฑฐ๋ ์จ๊ฒจ์ ธ ์์ผ๋ฉด ์ ๋ฉ๋๋ค.
$ docker --version
Docker version 17.09.0-ce, build afdb6d4
$ docker-compose --version
docker-compose version 1.16.1, build 6d1ac21
@jottr , ๋ฌธ์ ์ฐธ์กฐ :
extends ํค์๋๋ Compose ํ์ผ ๋ฒ์ 2.1๊น์ง์ ์ด์ Compose ํ์ผ ํ์์์ ์ง์๋์ง๋ง(v1์ extends ๋ฐ v2์ extends ์ฐธ์กฐ) Compose ๋ฒ์ 3.x์์๋ ์ง์๋์ง ์์ต๋๋ค.
๊ทธ๋์ ๋น์ ์ด ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ extends
์ฌ์ฉํ๋ฉด ์ต๋ ์ถฉ์ค ํ ํ์๊ฐ version: '2.1'
.
๋ด ์๋ชป์ด์ผ. ์ฌ์ ํ ๋นจ๊ฐ์ ์ฌ์ฉ ์ค๋จ ๊ฒฝ๊ณ ๊ธฐํธ์ ํจ๊ป ๋ฌธ์ ์๋จ์ ์์ด์ผ ํฉ๋๋ค.
๋ด ์๋ชป์ด์ผ. ์ฌ์ ํ ๋นจ๊ฐ์ ์ฌ์ฉ ์ค๋จ ๊ฒฝ๊ณ ๊ธฐํธ์ ํจ๊ป ๋ฌธ์ ์๋จ์ ์์ด์ผ ํฉ๋๋ค.
@jottr Github์ ์ฌ์ฉํ์ฌ ์ด์ ๋ํ ๋ณ๋์ ๋ฌธ์ ๋ฅผ ๋ง๋ค๊ฑฐ๋ PR์ ๋ง๋ค ์๋ ์์ต๋๋ค. ๋ฐฉ๊ธ ๋ฌธ์ ๋ฅผ ์์ฑํ์ต๋๋ค. https://github.com/docker/docker.github.io/issues/5340
์ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด docker-compose-override.yml
์์ต๋๋ค.
yaml
version: "3.4"
services:
common:
extra_hosts:
- "host1:172.28.5.1"
- "host2172.28.5.2"
- "host3:172.28.5.3"
networks:
default:
external:
name: "common-network"
๊ทธ๋ฆฌ๊ณ ๋คํธ์ํฌ์ extra_hosts๋ฅผ ๊ณต์ ํด์ผ ํ๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ docker-compose.yml
ํ์ผ์ด ์์ต๋๋ค. ํ์ฅ ๊ธฐ๋ฅ ์์ด ์ด๊ฒ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น?
yaml
version: "3.4"
services:
mongo:
image: "mongo"
container_name: "mongo"
hostname: "mongo"
volumes:
- "/opt/docker/mongo/default.conf:/usr/local/etc/mongo/mongod.conf"
- /opt/data/mongo:/data/db"
ports:
- "27017:27017"
command: "mongod --config /usr/local/etc/mongo/mongod.conf"
networks:
default:
ipv4_address: "172.28.5.4"
docker-compose๊ฐ yaml ์ต์ปค์ ๋ค๋ฅธ ํ์ผ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ์ง์ํ๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค. ํ์ผ์ ๋ณํฉํ ํ ์ต์ปค ๋ฐ ์ฐธ์กฐ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด:
yaml
version: "3.4"
services:
common: &common
extra_hosts:
...
networks:
...
yaml
version: "3.4"
services:
mongo:
<<: *common
image: "mongo"
container_name: "mongo"
...
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
yaml
version: "3.4"
services:
mongo:
image: "mongo"
container_name: "mongo"
extra_hosts:
// EXTRA HOSTS HERE
networks:
...
@sandro-csimas: https://docs.docker.com/compose/compose-file/#extension -fields์์ ๊ฐ๋ฅํฉ๋๋ค.
@shin- ์ด ํฐ์ผ์ ๋ซ์ ์ ์๋์?
@rdxmb ์ ๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์์ต๋๋ค. ๋ด๊ฐ ๋ณผ ์ ์๋ฏ์ด ๋ค๋ฅธ docker-compose ํ์ผ์์ ํ์ฅํ ์ ์์ต๋๋ค.
์ด๊ฒ์ด https://github.com/docker/compose/issues ์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ด ๋ง์ต๋๊น?
์ผ๋ถ ๋๋ฒ๊น :
# cat docker-compose.yml
version: "3.4"
services:
foo-not-bar:
<< : *common
foo-bar:
<< : *common
environment:
- FOO=BAR
x-common-definitions-for-all-our-services:
&common
image: phusion/baseimage
environment:
- FOO=NOTBARBYDEFAULT
์ด๊ฒ์ ์์
์ค์
๋๋ค
docker stack deploy -c docker-compose.yml test
docker-compose๋ฅผ ์ฌ์ฉํ ๋:
# docker-compose up
ERROR: yaml.composer.ComposerError: found undefined alias 'common'
in "./docker-compose.yml", line 4, column 10
yml ํ์ผ์ ๋ค์์ผ๋ก ๋ณ๊ฒฝ:
version: "3.4"
x-common-definitions-for-all-our-services:
&common
image: phusion/baseimage
environment:
- FOO=NOTBARBYDEFAULT
services:
foo-not-bar:
<< : *common
foo-bar:
<< : *common
environment:
- FOO=BAR
docker-compose์์๋ ์๋ํฉ๋๋ค.
๋ฐ๋ผ์ ์ด๊ฒ์ด ์ฌ๋ฌ ํ์ผ์์๋ ์๋ํด์ผ ํ๋ค๊ณ ์๊ฐํ๋๋ฐ ๊ทธ๋ ์ง ์์ต๋๋ค.
# docker-compose -f compose-services.yml -f compose-default.yml config > docker-compose.yml
ERROR: yaml.composer.ComposerError: found undefined alias 'common'
in "./compose-services.yml", line 5, column 10
t# docker-compose -f compose-default.yml -f compose-services.yml config > docker-compose.yml
ERROR: yaml.composer.ComposerError: found undefined alias 'common'
in "./compose-services.yml", line 5, column 10
# cat compose-services.yml
version: "3.4"
services:
foo-not-bar:
<< : *common
foo-bar:
<< : *common
environment:
- FOO=BAR
# cat compose-default.yml
x-common-definitions-for-all-our-services:
&common
image: phusion/baseimage
environment:
- FOO=NOTBARBYDEFAULT
๊ทธ๋ฌ๋ ๋ฌผ๋ก cat
์ฌ์ฉํ๋ฉด ์ด๋ฅผ ๋ณํฉํ ์ ์์ต๋๋ค.
# cat compose-default.yml compose-services.yml > docker-compose.yml && docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.
Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.
To deploy your application across the swarm, use `docker stack deploy`.
Creating network "test_default" with the default driver
Creating test_foo-bar_1 ...
Creating test_foo-not-bar_1 ...
Creating test_foo-bar_1
Creating test_foo-bar_1 ... done
๋ค์ ๋ฒ์ ์ผ๋ก xenial์์ ์คํ:
# docker --version
Docker version 17.11.0-ce, build 1caf76c
# docker-compose --version
docker-compose version 1.17.0, build ac53b73
@rdxmb , ๊ฐ์ฌํฉ๋๋ค!
๋ฐ๋ผ์ "cat" ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์์ฑ ํ์ผ์ ๋ณํฉํ๊ณ ์ต์ข
ํ์ผ์ ์คํํด์ผ ํฉ๋๋ค.
๋๋ ๋ํ ์ด๊ฒ์ ํ๊ธฐ ์ํด docker-compose config
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ๊ฒฝ๋ณ ์ค์ ์ ์:
์ด๊ฒ์ CI ํ์ดํ๋ผ์ธ์ ์ํด ์คํ๋ฉ๋๋ค: docker-compose -f docker-compose.yml -f docker-compose.override.prod.yml config > docker-compose.prod.yml
๊ทธ๋ฐ ๋ค์ docker stack deploy -c .\docker-compose.prod.yml my-stack
์ด๋ฅผ ์ํด ํฌํํ์ญ์์ค. extends๋ v3์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
v2์์ ๋ง์ด ์ฌ์ฉํ๋๋ฐ ์ ๋ง ์ ์ฉํฉ๋๋ค!
+1
v3์์ extends
์ง์์ ๋ณด๊ณ ์ถ์ต๋๋ค. ๋ด docker-compose.yml
ํ์ผ์ ๋ง์ด ๊ฑด์กฐํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ด ๋ฌธ์ ๊ฐ ์ ๊ธฐ๋ ์ง ๊ฑฐ์ 1๋ ์ด ๋์๊ณ ๋ง์ ์ฌ๋๋ค์ด ์ด ๊ธฐ๋ฅ์ ํ์๋ก ํ๋ค๋ ๊ฒ์ ๋ถ๋ช ํฉ๋๋ค. ๊ทธ๋ฌ๋ Docker ๊ฐ๋ฐ์๊ฐ ์ด ์์ฒญ์ ๋ํ ์๋ต์ ์ ํ ์ฝ์ง ์์์ผ๋ฉฐ ๋ฆด๋ฆฌ์ค ์ ์ docker-compose v3์ ํฌํจ๋์ง ์์ ์ด์ ์ ๋ํ ์ค๋ช ๋ ์ฝ์ง ์์์ต๋๋ค.
์๋ก์ด ๊ธฐ์ ์ ๋ฏฟ๋ ๊ณ ๊ฐ์ ์ํด ๊ธฐ๋ฅ์ ์ ์งํ๊ฑฐ๋ ํต์ ์กฐ์ฐจ ํ ์ ์๋ค๋ฉด ์ํํธ์จ์ด์ ์ฌํ ์ํ์ ๋๋ค.
์ํฉ์ ๋ํ ํ ๊ฐ์ง ๊ฐ๋ฅํ ํด์(๋ฐ ์๋ง๋ ํ์ฌ ์ค๋ ๋์ ์์ฝ)์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
cat
๋ฐ ๊ณ ๊ธ ์ ๊ทผ ๋ฐฉ์ ์ ์ฐธ์กฐํ์ญ์์ค. ๊ฐ๋จํ ์ ๊ทผ ๋ฐฉ์ ์ฃผ์์ ๋์ ํฅํด ์ฌ๋ฌ ํ์ผ์ ๋ก๋ํ๋ docker-compose์ ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ค๋๋ค(๋๊ฐ ์ด์ ๋ํ ๋ฌธ์ ๋ฅผ ์์ฑํ์ต๋๊น?). ๊ทธ๊ฒ์ด docker-compose์์ ์์ ๋๋ฉด ํ์ผ ๋ณํฉ์ด ์ ํ ํ์ํ์ง ์์ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ๋ค์ค ํ์ผ ์ง์์ ์ํ๋ ์ฌ๋๋ค์ @rdxmb๊ฐ ์ ์ํ ๋๋ก docker/compose/issues ์์ ๊ณ์๋์ด์ผ ํฉ๋๋ค.extends
๋ค์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ๊ณ ๋ ค๋์์ผ๋ฉฐ( GitHub ํ๋ก์ ํธ ์ด๋ฒคํธ ์ฐธ์กฐ, Docker ํ์ ์ข์ ํฌ๋ช
์ฑ, ๊ฐ์ฌํฉ๋๋ค!) ๊ฒฐ๊ณผ๋ฅผ "์ ๋ต์ ์ผ๋ก ๋ ์ค์ํ ๋ค๋ฅธ ๋ง์ ๊ฒ๋ค์ด ์์ต๋๋ค"๋ผ๊ณ ํด์ํ ์ ์์ง๋ง ์ฌ์ ํ extends
๋ํ pull ์์ฒญ์ ์์ฑํฉ๋๋ค.๋์๊ฒ ๊ทธ๊ฒ์ ์๋ฒฝํ๊ฒ ์ดํดํ ์ ์๋ ๊ด์ ์ด๋ค.
@aCandidMind ๋์ํ์ต๋๋ค.
IMHO, @aCandidMind๊ฐ ์ธ๊ธํ ์ ๊ทผ ๋ฐฉ์์ด ์๋ํ๋๋ผ๋ extends
์ ๊ณตํ๋ ๋ ๊ฐ๋จํ๊ณ ๊น๋ํ ๋ฉ์ปค๋์ฆ์ ๋ณต์ก์ฑ์ ์ถ๊ฐํฉ๋๋ค.
๋์ผ ์๋ ์์ง๋ง ์ ๋นํ ๋ณต์กํ ํ์ฅ ๊ตฌ์ฑ์ ํ์ฅ ํ๋๋ก ์ฎ๊ธฐ๋ฉด ์ฝ๊ณ ์ ์งํ๊ธฐ๊ฐ ํจ์ฌ ๋ ์ด๋ ค์์ง๋๋ค.
๋ง์ ๋๊ธ๊ณผ ๊ฒ์๋ฌผ์ ์ฝ์ ํ์๋ ํ์ฅ ๊ธฐ๋ฅ์ด ์ญ์ ๋ ์ด์ ์ ์ด๋ฌํ ๊ธฐ๋ฅ ์ ํ์ ์ด์ ์ด ๋ฌด์์ธ์ง ์ฌ์ ํ ๋ช
ํํ์ง ์์ต๋๋ค.
์ฝ๊ฐ์ bash ๋ง์ ๋ก ๊ฐ๋ฅํฉ๋๋ค. ํ ์คํธ ์ ์ฅ์๋ฅผ ๋ง๋ค์ด ์ง์ ์๋ํด ๋ณผ ์ ์์ต๋๋ค.
stack deploy
๋ช
๋ น์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑํ๋ฉด ๋ฉ๋๋ค.
docker stack deploy --compose-file=<(docker-compose -f docker/prod.yml -f docker/dev.yml config) <stackname>
@tylerbuchea - ๊ทธ bash ๋ง์ ์ ์ ์ผํ ๋จ์ ์ WARNING: Some services (<service-name(s)>) use the '<key>' key, which will be ignored. Compose does not support '<key>' configuration
์ป์ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ก ์ธํด ํผ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ํ์ง๋ง ์๋ํฉ๋๋ค ๐
@dnmgns ๋ค ๋ง์ด ๋ง์! ์ง์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. @joaocc๊ฐ ๋งํ๋ฏ์ด ๊ธฐ๋ณธ ์ง์์ ๋ฅ๊ฐํ๋ ๊ฒ์ ์์ง๋ง ์์์ ์ธ๊ธํ ์๋ฃจ์ ์ bash ์ด์ธ์ ์ข ์์ฑ์ด ์๋ค๋ ์ ์์ ๋ด๊ฐ ์ฐพ์ ์ ์๋ ์ต๊ณ ์ ์๋ฃจ์ ์ ๋๋ค.
@tylerbuchea ๋๋ฌ์ด ๋ฐฉ๋ฒ ์ค ํ๋๋ stderr์ /dev/null๋ก ๋ฆฌ๋๋ ์
ํ๋ ๊ฒ์
๋๋ค. :)
docker stack deploy --compose-file=<(docker-compose -f docker/prod.yml -f docker/dev.yml config 2> /dev/null) <stackname>
๋ถ๋๋ฝ์ง ์์์ ๐
extend
๋ํ ์ด๋ฌํ ํผ๋์ ๋ํด ๋ฌธ์๊ฐ ๋ ๋ช
ํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
extend
๋ํ ์ค๋ช
์ ์ฌ์ฉ์๋ฅผ ์
๊ทธ๋ ์ด๋ ๋ฐฉ๋ฒ ๋ฌธ์๋ก ๋ฆฌ๋๋ ์
ํ๊ณ ์
๊ทธ๋ ์ด๋ ๋ฐฉ๋ฒ ๋ฌธ์๋ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ํด extend
๋ํ ์ค๋ช
์ ๋ค์ ๊ฐ๋ฆฌํต๋๋ค. ์ด๊ฒ์ ์ถฉ๋ถํ ๋์์ด ๋์ง ์์ต๋๋ค. ์ฌ์ฉ์๋ก์ ์ด ์ ์ฒด ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ, ๋ด๊ฐ ๊ฐ์ง ์ต์
๋ฐ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ ๋ํ ๋์์ ๊ธฐ๋ํฉ๋๋ค. v3์์ extend
๋ฅผ ์ ๊ฑฐํ๊ธฐ๋ก ํ ๊ฒฐ์ ๋ค์๋ ๋ถ๋ช
ํ ์์ด๋์ด๊ฐ ์์์ต๋๋ค.
๋ณด๋ค:
https://docs.docker.com/compose/extents/#extending -์๋น์ค
https://docs.docker.com/compose/compose-file/compose-versioning/#upgrading
@tylerbuchea ํ๋ฅญํ ์ ๋ผ์ด๋ bash ๊ธฐ๋ฐ ์๋ฃจ์
๊ณผ ๊ด๋ จํ์ฌ,
์ฌํ๊ฒ๋ ์ผ๋ถ ๊ณ ๊ธ Docker ์คํ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์์ต๋๋ค.
WARNING: Some services (web) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.
WARNING: Some services (web) use the 'configs' key, which will be ignored. Compose does not support 'configs' configuration - use `docker stack deploy` to deploy to a swarm.
https://github.com/docker/cli/pull/569 ๊ฐ ๋ณํฉ๋๊ธฐ ๋๋ฌธ์ 18.03๋ถํฐ docker stack deploy
์ฌ๋ฌ ์์ฑ ํ์ผ์ ํ๋๋ก ๋ณํฉํ๋ ๊ฒ์ ์ง์ํฉ๋๋ค. ๊ทธ๊ฒ์ ์์ ํ ๋์ฒดํ์ง ์์ต๋๋ค extends
composefile ํ์ v2์์ ํค๋ฅผ ๊ทธ๋ฌ๋ ํฌ๋ง์ด ๋ฐฉ๋ฒ์ด ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๊ณ ๐ผ
๋ด ์์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ yq
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด์์ต๋๋ค(Bash๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋จ์ผ ๋ผ์ด๋๋ก ๊ฒฐํฉํ ์ ์์).
yq merge --overwrite docker-stack.yml docker-stack.preprod.yml > merged-docker-stack.yml
docker stack deploy -c merged-docker-stack.yml preprod
@Lucas-C ๊ทธ๋ค์ ์ถ๋ ฅ์ deploy
๋ฐ config
ํค๊ฐ ๊ณ์ ํฌํจ๋๋ค๋ ๊ฒฝ๊ณ ์ผ ๋ฟ์
๋๋ค. docker-compose -f docker/prod.yml -f docker/dev.yml config
๋ฅผ ์คํํ๋ฉด ์ด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
ํ์ผ ์์ฑ v3.4 ์ด์์ฉ์ ๋๋ค. ๊ต์ฐจ yaml ์ฐธ์กฐ(๋ถ๋ถ)๋ฅผ ์ง์ํฉ๋๋ค. ์ด zsh alias/perl ์คํฌ๋ฆฝํธ๋ก ์๋ฃํ์ต๋๋ค.
alias regen=$'perl -MFile::Slurp=read_file -MYAML=Load,Dump -MHash::Merge::Simple=merge -E \'
local $YAML::QuoteNumericStrings = 1;
$n=read_file("/data/docker-compose.yml");
$s=Dump(merge(map{Load($n.read_file($_))}@ARGV));
local $/ = undef;
$s =~ s/\\bno\\b/"no"/g;
say $s;
\' $(find /data -mindepth 2 -maxdepth 4 -name docker-compose.yml) >! /data/x-docker-compose.yml'
regen
export COMPOSE_FILE=/data/x-docker-compose.yml
์ฅ์ : perl์ ์ผ๋ฐ์ ์ธ ๋๊ตฌ์ด๋ฉฐ ๋ชจ๋ perl ๋ชจ๋๋ ๋น ๋ฅด๊ฒ ์์ฑ๋ฉ๋๋ค.
๋จ์ : ํดํน์ ์ซ์ง๋ง DRY ์ธ์๋ ๋ฐฉ๋ฒ์ด ์๋ค. ์ต์ข
docker-compose๋ ์ฝ 900์ค์
๋๋ค. ์ฒ์๋ถํฐ ํ๋์ ํ์ผ๋ก ์ง์ํ๊ธฐ๋ฅผ ์ํ์ญ๋๊น? python docker-compose๋ก ๋ํ๋ ๋ฐ์ด๋๋ฆฌ ๋์ปค๋ฅผ ํ ํต์ผ๋ก ๋ํํ๋ ๊ฒ์ ๋ถ๋๋ฌ์ด ์ผ์
๋๋ค.
์ด๋ป๊ฒ ํ์ฅ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ ์ ์์ต๋๊น? ํต์ฌ ๊ธฐ๋ฅ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ์ฉ docker-compose config
ํ์ค ์
๋ ฅ ์ต์
์ ํ์ดํ docker stack deploy -c -
๋๋ฅผ ์ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค :
docker-compose -f docker-compose.yml \
-f docker-compose.extended.yml \
config \
| docker stack deploy -c - my-stack
๋๋ ์ด๊ฒ์ ์๋ํ์ง ์์์ง๋ง docker stack deploy
๋ฌธ์์์ ์ด๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๊ตฌ์ฑ์ด ์ฌ๋ฌ Compose ํ์ผ๋ก ๋ถํ ๋ ๊ฒฝ์ฐ(์: ๊ธฐ๋ณธ ๊ตฌ์ฑ ๋ฐ ํ๊ฒฝ๋ณ ์ฌ์ ์) ์ฌ๋ฌ
--compose-file
ํ๋๊ทธ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์๋ก ๋ค๋ฉด:
docker stack deploy --compose-file docker-compose.yml -f docker-compose.prod.yml vossibility
https://docs.docker.com/engine/reference/commandline/stack_deploy/#compose - ํ์ผ
extends
์ ๊ฑฐ์ ๋ํ ๊ทผ๊ฑฐ๊ฐ ์ด๋๊ฐ์ ๋ฌธ์ํ๋์ด ์์ต๋๊น? ๊ณต์ ๋ฌธ์(์: https://docs.docker.com/compose/extens/#extending -services)์ ์ค๋ช
๋์ด ์์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ์ฉ์๊ฐ ๊ทผ๊ฑฐ๋ฅผ ์ดํดํ ์ ์๋ค๋ฉด ์ฌ์ฉ์๋ ์ ๊ฑฐ์ ๋์ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ ๋์ ์์ด๋์ด๋ฅผ ๊ฐ๋ฐํ ์ ์์ต๋๋ค. ๊ฐ์ฌ ํด์.
@shaun-blake ์ฌ๋ฌ ์์ฑ ํ์ผ์ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค. ์ฌ๋๋ค์ด ์ฌ์ฉํ๋ ์ ๊ทผ ๋ฐฉ์์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์์์ด๋ผ๊ธฐ๋ณด๋ค๋ ํผํฉ์ ๊ฐ๊น์ต๋๋ค. ๋น๋ํ๊ฑฐ๋ ์คํํ ๋ ์ฌ๋ฐ๋ฅธ ํ๊ฒฝ yaml ํ ํ๋ฆฟ์ docker-compose.override.yml์ ๋ณต์ฌํฉ๋๋ค.
๋ค์ค docker ์์ฑ ํ์ผ(์: base.yml
, local.yml
, prod.yml
)์ ์๋น์ค๊ฐ ๋ค๋ฅธ ํ์ผ์ YAML ์ต์ปค๋ฅผ ์ฌ์ฉํ๋๋ก ํ์ฉํ์ง ์์ผ๋ฏ๋ก ์ฌ๋ฌ yml ํ์ผ ๊ฐ์ ํฉํฐ๋ง๋ ์๋น์ค ์ ์๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. .
์ฐธ๊ณ :์ด ๋ฌธ์ ๋ ๋๋ถ๋ถ์ ๋๊ธ์ ๋ฌ์ 13์
๋๋ค https://github.com/moby/moby/issues?q=is%3Aissue+is%3Aopen+sort%3Acomments-desc ๊ฐ์ฅ ์ข์ 3 ์ผ.
์ฌ์ฉ์๊ฐ ๊ทผ๊ฑฐ๋ฅผ ์ดํดํ ์ ์๋ค๋ฉด ์ฌ์ฉ์๋ ์ ๊ฑฐ์ ๋์ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ ๋์ ์์ด๋์ด๋ฅผ ๊ฐ๋ฐํ ์ ์์ต๋๋ค. ๊ฐ์ฌ ํด์.
์ฒ์์ extends
๋ฅผ ์ ๊ฑฐํ ๊ทผ๊ฑฐ์ ๋ํ ๋ฌธ์์ +1...
๊ฑฐ์ 1๋ ๋ฐ์ด ์ง๋ ํ์๋ ์ฌ์ ํ _์ฐ์ฅ_ํ์ง ์์ต๋๋ค. Cmon, devs, u๋ ๋์์ ์ ๊ณตํ์ง ์๊ณ sth๋ฅผ ์ ๊ฑฐํ์ง ์์ต๋๋ค.
๊ทธ๋ค์ ๊ตฌ์ฑ์ด๋ผ๋ ๋์์ ์ ๊ณตํฉ๋๋ค. ์ค๋ ๋์์ ๋ด ๋๋ต์ ์ฝ์ผ์ญ์์ค.
-ํ๋ฆฌํฌ
2018๋ 7์ 30์ผ 09:41์ Xiaohui Liu [email protected]์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๊ฑฐ์ 1๋ ๋ฐ์ด ์ง๋ ํ์๋ ์ฌ์ ํ ์ฐ์ฅ๋์ง ์์ต๋๋ค. Cmon, devs, u๋ ๋์์ ์ ๊ณตํ์ง ์๊ณ sth๋ฅผ ์ ๊ฑฐํ์ง ์์ต๋๋ค.
โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub https://github.com/moby/moby/issues/31101#issuecomment-408790200 ์์ ํ์ธํ๊ฑฐ๋ https://github.com/notifications/unsubscribe-auth/AAS_0AOynjpfVnVo4ZqciMbmjBmkcTQ ์ค๋ ๋๋ฅผ ์์๊ฑฐ
@dedalozzo , "์ฐ๋ ๋์์" == ?
์ฌ๊ธฐ ๋ด ์๊ฒฌ์ ์ฐธ์กฐํ์ญ์์ค.
https://github.com/moby/moby/issues/31101#issuecomment -329527600 https://github.com/moby/moby/issues/31101#issuecomment-329527600
๊ธฐ๋ณธ์ ์ผ๋ก ์ปจํ ์ด๋์ ๊ตฌ์ฑ์ ์ฌ์ ์ํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ค๋ฉด .yml ํ์ผ ์ฒด์ธ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
"์ฌ๋ฌ Compose ํ์ผ ์ง์ "์ ์ฝ์ผ์ญ์์ค.
์ฌ๋ฌ -f ๊ตฌ์ฑ ํ์ผ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ํ์ผ์ ์ ๊ณตํ๋ฉด Compose๊ฐ ํ์ผ์ ๋จ์ผ ๊ตฌ์ฑ์ผ๋ก ๊ฒฐํฉํฉ๋๋ค. Compose๋ ํ์ผ์ ์ ๊ณตํ ์์๋๋ก ๊ตฌ์ฑ์ ๋น๋ํฉ๋๋ค. ํ์ ํ์ผ์ ์ ํ ํ์ผ์ ๋ฌด์ํ๊ณ ์ถ๊ฐํฉ๋๋ค.
https://docs.docker.com/compose/reference/overview/ https://docs.docker.com/compose/reference/overview/
์ด ์ ๊ทผ ๋ฐฉ์์ ์์๋ณด๋ค ํฉ์ฑ์ ์ฌ์ฉํ์ฌ ๋ค์๊ฐ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ต๋๋ค.
2018๋ 7์ 30์ผ 15:23์ Serban Teodorescu [email protected]์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@dedalozzo https://github.com/dedalozzo , "์ค๋ ๋์์" == ?
โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ํ์ ํ๊ฑฐ๋ GitHub https://github.com/moby/moby/issues/31101#issuecomment-408880809 ๋๋ ์ค๋ ๋ https://github.com/notifications/unsubscribe-auth/AAS_0FZO30NplqHRid_Id8VBOJW7nk5MDaks๋ฅผ ์์๊ฑฐํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๊ฒฐํฉํ๋ฉด ๋์ผํ ํ์ฅ์ฑ์ ๋ค์ ์ป์ ์ ์์ต๋๊น?
yaml ํ์ฅ ํ๋ (2.1+/3.4+ ์์ฑ)
x-
ํ๋๊ฐ ๋ค๋ฅธ ํ์ผ ์
๋ฐ๋ผ์ ๋ฃจํธ include
๋ชฉ๋ก์ด ๋ก๋ํ ํ์ผ์ ์ง์ ํ๋๋ก ํ์ฉํ ์ ์์ต๋๋ค.
x-include
๋ฃ๊ณ ํ์ค YAML ์ต์ปค ๋ฐ ๋ณํฉ์ ํตํด ์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
# /docker-compose.yml
version: '2.1'
volumes:
nginx_file_sockets:
external: false
driver: local
services:
reverse_proxy:
extends:
file: reverse_proxy/docker-compose.yml
service: proxy
restart: 'always'
ports:
- "80:80"
- "443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
reverse_proxy_test:
extends:
file: reverse_proxy/docker-compose.yml
service: proxy
restart: 'always'
ports:
- "8080:80"
- "8443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
web:
extends:
file: webservice/docker-compose.yml
service: app
restart: 'always'
environment:
ENVIRONMENT: 'production'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
web_staging:
extends:
file: webservice/docker-compose.yml
service: app
restart: 'no'
environment:
ENVIRONMENT: 'staging'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
# /proxy/docker-compose.yml
version: '2.1'
services:
proxy:
build: ./
volumes:
- /certs:/certs:ro
# /webservice/docker-compose.yml
version: '2.1'
services:
app:
build:
context: ./folder
args:
LINUX_VERSION: 20.s
LINUX_FLAVOR: dash
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- bootstrap.memory_lock=true
ulimits:
memlock:
soft: -1
hard: -1
# /proxy/docker-compose.yml
version: '3.9'
services:
proxy:
&proxy
build: ./
volumes:
- /certs:/certs:ro
# /webservice/docker-compose.yml
version: '3.9'
services:
app:
&app
build:
context: ./folder
args:
LINUX_VERSION: 20.s
LINUX_FLAVOR: dash
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- bootstrap.memory_lock=true
ulimits:
memlock:
soft: -1
hard: -1
# /docker-compose.yml
version: '3.9'
include:
- /proxy/docker-compose.yml
- /webservice/docker-compose.yml
volumes:
nginx_file_sockets:
external: false
driver: local
services:
reverse_proxy:
<< : *proxy
restart: 'always'
ports:
- "80:80"
- "443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
reverse_proxy_test:
restart: 'always'
<< : *proxy
ports:
- "8080:80"
- "8443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
web:
<< : *app
restart: 'always'
environment:
ENVIRONMENT: 'production'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
web_staging:
restart: 'no'
extends:
file: web1/docker-compose.yml
service: app
environment:
ENVIRONMENT: 'staging'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
@@ /proxy/docker-compose.yml @@
-version: '2.1'
+version: '3.9'
services:
proxy:
+ &proxy
build: ./
volumes:
- /certs:/certs:ro
```
```diff
@@ /webservice/docker-compose.yml @@
-version: '2.1'
+version: '3.9'
services:
app:
+ &app
build:
context: ./folder
args:
LINUX_VERSION: 20.s
LINUX_FLAVOR: dash
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- bootstrap.memory_lock=true
ulimits:
memlock:
soft: -1
hard: -1
```
```diff
@@ /docker-compose.yml @@
-version: '2.1'
+version: '3.9'
+include:
+ - /proxy/docker-compose.yml
+ - /webservice/docker-compose.yml
volumes:
nginx_file_sockets:
external: false
driver: local
services:
reverse_proxy:
- extends:
- file: reverse_proxy/docker-compose.yml
- service: proxy
+ << : *proxy
restart: 'always'
ports:
- "80:80"
- "443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
reverse_proxy_test:
- extends:
- file: reverse_proxy/docker-compose.yml
- service: proxy
+ << : *proxy
restart: 'no'
ports:
- "8080:80"
- "8443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
web:
- extends:
- file: webservice/docker-compose.yml
- service: app
+ << : *app
restart: 'always'
environment:
ENVIRONMENT: 'production'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
web_staging:
- extends:
- file: webservice/docker-compose.yml
- service: app
+ << : *app
restart: 'no'
environment:
ENVIRONMENT: 'staging'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
```
<hr>
Resulting in the final version, which should be already yaml parsable:
```yml
# /docker-compose.yml
version: '3.9'
#include:
# - /proxy/docker-compose.yml
# - /webservice/docker-compose.yml
x-include:
/proxy/docker-compose.yml:
version: '3.9'
services:
proxy:
&proxy
build: ./
volumes:
- /certs:/certs:ro
/webservice/docker-compose.yml:
version: '3.9'
services:
app:
&app
build:
context: ./folder
args:
LINUX_VERSION: 20.s
LINUX_FLAVOR: dash
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- bootstrap.memory_lock=true
ulimits:
memlock:
soft: -1
hard: -1
volumes:
nginx_file_sockets:
external: false
driver: local
services:
reverse_proxy:
<< : *proxy
restart: 'always'
ports:
- "80:80"
- "443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
reverse_proxy_test:
<< : *proxy
restart: 'no'
ports:
- "8080:80"
- "8443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
web:
<< : *app
restart: 'always'
environment:
ENVIRONMENT: 'production'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
web_staging:
<< : *app
restart: 'no'
environment:
ENVIRONMENT: 'staging'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
AFAIK๋ ๋์ผํ ํ์ผ์์ ๋ฐ๋ณต๋๋ ๋ถ๋ถ์ ํผํ๊ธฐ ์ํด laguage ์ฌ์ ์์ฒด์ ๋ด์ฅ๋ YAML ๊ธฐ๋ฅ์ ๋๋ค. ๋ค๋ฅธ ํ์ผ์ ์ฌ์ฉํ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๊ฐ๋ฅํฉ๋๋ค.
ํด๋น ๊ธฐ๋ฅ์ YAML ์ฌ์ ์์ฒด์ ์ ์ํด์ผ ํฉ๋๋ค.
์ด ํ ๋ก ์ ๋ค์๊ณผ ๊ฐ์ด ์์ค๋ฉ๋๋ค.
docker-compose -f file.yml
๊ฐ docker-compose -f file.yml -f file_extension.yml
๋ณด๋ค ํจ์ฌ ๋ ๋์ ์ด์ ๋ ๋ฌด์์
๋๊น?๋ช ๋ น์ค์์ ์์ ํ ๋๋ง ๋ถํธ์ด ๋์ ๋๊ฒ ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ ์ ๊ทธ๊ฒ์ ์ธ์ ํด์ผ ํฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ์ด์จ๋ ์คํฌ๋ฆฝํ ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ ๋ค์ ์ค์ ์ธ์์ ๊ฒฝ์ฐ docker-compose up service
๋ณด๋ค ๋ ์๋ฏธ๊ฐ docker-compose -f service.yml up
:์์ (์ผ๋ช
๋ช
๋ น ํ์) ์ง์ญ ๊ฐ๋ฐ์ ํ์ํ ๋ชจ๋ ๊ฒ์ ์ ์ docker-compose.override.yml
.
์ฃผ์ด์ง ์๋ฏธ๋ก ์ ๋งค์ฐ ๊นจ๋ํ๊ณ ์ ์๊ฐํ์ต๋๋ค. service.yml
_๋ช
๋ น์ค ์ฌ์ฉ_์ ์ฑํํ๋ ๊ฒ์ ์๋ง๋ UX๋ฅผ ๋ฎ์ถ๋ ๊ฒ์ ์๋ฏธํ ๊ฒ์
๋๋ค. ์ด์ ๋ํ ๋ ๋ค๋ฅธ ์ฃผ์ฅ์ด ์์ต๋๋ค. ์ฒซ๋์ docker-compose.yml
๊ฐ ๋ฌด์์ธ์ง๋ ๋ถ๋ช
ํ์ง๋ง service.yml
๋ ๋ฌด์์ด๋ ๋ ์ ์์ต๋๋ค. ์ค์ ๋ก๋ ๋ฌด์์ด๋ ๋ ์ ์์ต๋๋ค.
๋ฉด์ฑ ์กฐํญ: ๋๋ฐ์ ์ธ ์๊ฒฌ. :wink: ๊ฐ๋ฅํ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ง ์์์ต๋๋ค...
์ด ๊ธด ํ ๋ก ํ์ ๊ทธ๊ฒ์ด ์ฑ๊ณตํ ์ง ์ฌ๋ถ๋ ํ์คํ์ง ์์ต๋๋ค. IMHO, extends๋ ๋ฉ์ง๊ณ ์ต์ํ ์ ์คํ๊ฒ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ ๋จ์ํ ์ญ์ ํ๋ ๋์ ๋ ผ์๋์ด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ํ ๊ฐ์ง๋ v2 ๋ v3์ ๋ํ ๋ฌธ์ํ ์คํ ๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ ์ฌ๋๋ค์ด v3 ๊ฐ v2๋ฅผ
v2: docker-compose cli ์ ์ฉ์ ๋๋ค. ๋จ์ผ ๊ธฐ๊ณ์ ์์ง์ ์ด์ ์ ๋ง์ถ ๊ฐ๋ฐ ์ํฌํ๋ก. CI ๋น๋/ํ ์คํธ ์ํฌํ๋ก์๋ ์ข์ต๋๋ค. ์ด ๋ฒ์ ๋ถ๊ธฐ๋ v17.12์์ 2017๋ 12์์ ์ต์ ๊ธฐ๋ฅ์ ๋ฐ์์ต๋๋ค.
v3: ๋ค์ค ๋ ธ๋ ๊ฐ๋ ์ด ์๋ Swarm/Kube ์คํ์ ์ด์์ ์ด๋ฉฐ ๋๋ถ๋ถ์ docker-compose cli ๊ธฐ๋ฅ์ ๋ํ ์ง์์ ์ ์งํฉ๋๋ค.
๋น์ ์ด ๋ผ ๋๋ ๋์ปค ์ํฐํ๋ผ์ด์ฆ๋ Kubernetes ์คํ์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ, ์ฌ์ฉ v3์ผ๋ก ์ด์ ๊ฐ ์๋ค. v2.4๋ฅผ ์ฌ์ฉํ๋ฉด extends,Depends_on, extensionํ๋, ์ํ ํ์ธ์ด ์๋ depends_on
v3๋ ๋จ์ผ ์์ง docker-compose cli ์ธ๊ณ์ ๊ธฐ๋ฅ์ ๋ค์ค ๋ ธ๋ ํด๋ฌ์คํฐ ์ธ๊ณ์ ๋ณํฉํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค. ๋ชจ๋ v2 ๊ธฐ๋ฅ(์:Depends_on)์ด ํด๋ฌ์คํฐ์์ ์๋ฏธ๊ฐ ์๋ ๊ฒ์ ์๋๋๋ค. ๋ค๋ฅธ ๊ธฐ๋ฅ(์: ํ์ฅ)์ v3์ ํฌํจ๋์ง ์์์ต๋๋ค. v3 ์ด์ ์๋ ๋ชจ๋ ์ฝ๋๊ฐ docker-compose Python์ ์์๊ณ v3.0์ด Swarm์ ์ง์ํ๋ ค๋ฉด docker cli Go์์ ์ด๋ฅผ ๋ค์ ์์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ์ผ ์ ์์ต๋๋ค. ์ด์ ๊ทธ๋ค์ ์์ง ์กด์ฌํ์ง ์๋ Swarm ์คํ API๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์์ง ๋ฐ๋ชฌ์ ๋ค์ ์์ฑํ๊ณ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ฒ์ ์ ํ๋ ๋ถ๋ค์ ์ํด 3.0 ๋ฆด๋ฆฌ์ค ์ดํ ๋ค์ํ ๊ตฌ์ฑ, ํ ํ๋ฆฟ ๋ฐ ํ ์ํฌํ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์งํํ ๋ง์ ์์ ์ ์ ์ํ์ญ์์ค.
https://docs.docker.com/compose/extents/#extending -services์ ๋ฌธ์๋ extends ํค์๋๊ฐ v3์์ ์ ๊ฑฐ ๋์๋ค๋ ์ฌ์ค์ ๋นจ๊ฐ์์ผ๋ก ๊ฐ์กฐํด์ผ ํฉ๋๋ค. ์ด๋ ๋จ์ง _note_๋ณด๋ค ๋ ์ค์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ ์ด์ ์๋ํ์ง ์๋ ์ด์ ์ ๋ํด ๋ฌธ์๋ฅผ ๋ง์ด๊ทธ๋ ์ด์
ํ๊ณ ํ์ด๋ณธ ๋ค์ ์ฌ๊ธฐ์์ ๋๋ด๊ธฐ ์ ์ ๋ช ๊ฐ์ง ๋ซํ ๋ฌธ์ ๋ฅผ ๋ฐ๋๊ณ ์๋ ๋ฌธ์๋ก ๋์๊ฐ์ ๋ฌธ๊ตฌ๋ฅผ ํ์ธํ์ต๋๋ค.
extends ํค์๋๋ Compose ํ์ผ ๋ฒ์ 2.1๊น์ง์ ์ด์ Compose ํ์ผ ํ์์์ ์ง์๋์ง๋ง(v1์ extends ๋ฐ v2์ extends ์ฐธ์กฐ) Compose ๋ฒ์ 3.x์์๋ ์ง์๋์ง ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊ฟ ์ ์์ต๋๋ค.
extends ํค์๋๋ Compose ๋ฒ์ 3.x์์ ์ ๊ฑฐ๋์์ง๋ง Compose ํ์ผ ๋ฒ์ 2.1๊น์ง์ ์ด์ Compose ํ์ผ ํ์์์ ๊ณ์ ์ง์๋ฉ๋๋ค(v1์ extends ๋ฐ v2์ extends ์ฐธ์กฐ).
์์ ์ฐจ์ด์ง๋ง ๋ฌธ์๋ฅผ ํ์ด๋ณผ ๋ ๊ฐ๊ณผํ๊ธฐ ์ฌ์ด ์ฐจ์ด์ ๋๋ค.
@krisrp ํ๋ณด ์์ํ์ต๋๋ค
@BretFisher ๊ฐ์ฌ
v2๋ฅผ "version: docker-cli"๋ก, v3์ "version: swarm/kube"๋ก ๋ณ๊ฒฝํ ๊ณํ์ด ์์ต๋๊น?
๋๋ถ๋ถ์ ๋ค๋ฅธ ๋ฒ์ ๊ด๋ฆฌ ์ฒด๊ณ์์ v3๊ฐ v2๋ฅผ ๋์ฒดํ๋ ๋ฐฉ์์ ๊ณ ๋ คํ๋ฉด ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ตฌ๋ถํ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์
๋๋ค. ํ์ฌ ๋ ๋ค ์ ์ง๋๊ณ ๋ถ๊ธฐ๋๊ณ ์์ผ๋ฏ๋ก ๋ด๊ฐ ์ฐฉ๊ฐํ์ง ์๋ ํ ๋ ๋ค ์ ์ ๋์์์ ๊ฒ ๊ฐ์ต๋๋ค.
@krisrp ๋ฐ๋๋ก ๋ฉ์ด์ ๋ฒ์ ๋ฒํธ๋ฅผ ์๋ฆฌ๊ธฐ ์ํจ์ ๋๋ค.
@ cpuguy83 ๋๋ ๋ฌ๋ฆฌ ์์ํ์ง ์์์ต๋๋ค. ๋ ๋ช
ํํ๊ฑฐ๋ ๋ช
์์ ์ด์ง ๋ชปํ ์ ์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค.
IIRC Gnome 2 & 3๋ ๋ช ๋
์ ์ ๊ฐ๊ฐ์ ๋
๋ฆฝ์ ์ธ ํฌํฌ๊ฐ ์ ์ง๋์์ ๋ ์ด๋ฌํ ํผ๋์ ๊ฒช์์ต๋๋ค.
๋๋ ๋ฒ์ ๊ด๋ฆฌ(๋์ ๋ง์ฅ๋)์ ์๋ฏธ๋ก ์ ๋ํด ๋ ผ์ํ๊ธฐ ์ํด ์ด ์ค๋ ๋๋ฅผ ํ์ ์ํค๊ณ ์ถ์ง ์์ผ๋ฏ๋ก ๊ทธ๋๋ก ๋๊ฒ ์ต๋๋ค. v2 vs v3์ ๋ํ ๋ฌธ์ ๊ฐ์ ์ ๋ํ @BretFisher ์ ์ง๋ ์ฃผ ๊ฒ์๋ฌผ์ ์ ์ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ๋์์ด ๋์์ ๊ฒ์ ๋๋ค.
@shin- @cpuguy83 1๋ ์ด ์ง๋ ํ ์ด ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด ๋ฒ์ 3์ ๋ค์ ์ถ๊ฐํ์ง ์๋ ์ด์ ๊ฐ _๋ฌด์์ ๋๊น?
"๋ค๋ฅด๊ฒ ํ ์ ์์ต๋๋ค"(ํ์ง๋ง ์ค์ ๋ ๋์ ์๋ฃจ์
์ ์ ๊ณต๋์ง ์์) ์ธ์๋ ์ด์ ๋ํด ๋ง์ ๊ฒ์ ์ฐพ์ ์ ์์์ต๋๋ค.
๊ธฐ์ ์ ์ธ ์ ํ์ด ์์ต๋๊น? ์๋๋ฉด pull ์์ฒญ์ด ๋ถ์กฑํฉ๋๊น?
๊ฒฐ๊ตญ, ๋ด compose 2.1 ํ์ผ์ ์ฌ์ ํ โโ์ ์คํ๋๊ณ ์์ต๋๋ค.
์ด๋ฟ๋ง ์๋๋ผ ๋ณ๊ฒฝ ๋ก๊ทธ์ "์ ๊ฑฐ๋์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ '์ ๊ทธ๋ ์ด๋ ๋ฐฉ๋ฒ'์ ์ฐธ์กฐํ์ธ์."๋ผ๊ณ ํ์๋ฉ๋๋ค. ์ ๋ "์ ๊ทธ๋ ์ด๋ ๋ฐฉ๋ฒ"์ ๋ณด๊ณ ์ ๊ทธ๋ ์ด๋ ๋ฐฉ๋ฒ์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ณด๊ณ "์์ธํ ๋ด์ฉ์ '์๋น์ค ํ์ฅ'์ ์ฐธ์กฐํ์ญ์์ค"๋ผ๊ณ ๋งํฉ๋๋ค. "์๋น์ค ํ์ฅ"์ผ๋ก ์ด๋ํ์ฌ ๋ง์นจ๋ด ๋ด ํ์ผ์ ํ์ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๊ฒ ๋์ง๋ง "์ด ํญ๋ชฉ์ด ์ ๊ฑฐ๋์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ณ๊ฒฝ ๋ก๊ทธ๋ฅผ ์ฐธ์กฐํ์ญ์์ค"๋ผ๊ณ ๋ง ํ์๋ฉ๋๋ค.
์ด ์์ ์์ ์ด๊ฒ์ ๋ฌธ์ ์์ฑ์๊ฐ ํ๊ณ ์๋ ์์ธํ ๋๋ด์ฒ๋ผ ๋ณด์ ๋๋ค.
๊ถ๊ทน์ ์ผ๋ก "์คํ" ํ์์ ์ฌ๊ธฐ์์ ์ ์ด๋์ง ์์ผ๋ฉฐ Docker CLI์ ์ผ๋ถ์ ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก v3์์ ์ ์ธ๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค... ๋ํ ์ค์ ๋ก ์ถ๊ฐํ๋ ค๊ณ ํ๋ ์ฌ๋์ ๋ณธ ์ ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ docker/cli์์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค... ๊ธฐ๋ฅ์ด ์๋ ๊ฒ์ฒ๋ผ ์๋ํ๋ ๋์ ์์ค์ ๋ฌธ์ ๋ณ๊ฒฝ์ด ์๋ PR์ผ ์๋ ์์ผ๋ฏ๋ก ๋
ผ์ํ ์ ์๊ณ ์ค๊ณ๊ฐ ์น์ธ๋๋ฉด ๊ตฌํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. .
๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ตฐ๊ฐ๊ฐ ์ํ๋ฉด PR์ ํฉ๋๋ค. ๊ฑฐ๋ถ๋๋ ๊ฒฝ์ฐ์ ๋๋นํ์ฌ ๋ง์ ์๊ฐ์ ๋ญ๋นํ์ง ์๋๋ก ํ๊ธฐ ์ํด ๋ฌธ์ ๋ณ๊ฒฝ์ ์ ์ํฉ๋๋ค... ๋ค์ ํ ๋ฒ ์ v3์์ ์๋ต๋์๋์ง ํ์คํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ฐ์ ์๊ธฐ์. docker-compose๋ฅผ ๋ค์ ์ฌ์ฉํ๊ธฐ ์ ์ ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ธ์.
+1 ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ญ์์ค. ํ์ฅ ๊ธฐ๋ฐ ์์ฑ ํ์ผ์ด ์๊ณ ๊ทธ ๋๋ฌธ์ ๋ผ์ ์์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ฅ ๊ธฐ๋ฅ์ ๊ฒฝ์ฐ +1
์ด๊ฒ์ ๋ํ ์์์ด ์์ต๋๊น?
๊ทธ๋๋ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ด
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์์ง ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
๋ชจ๋ ์ ๋ฐ์ดํธ?
์ ๊บผ๋๋์ง์ ๋ํ ์ด์ ๊ฐ ์์๋์?
2019๋ 8์ 5์ผ ์์์ผ, 11:10 Jaykishan, [email protected]์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋ชจ๋ ์ ๋ฐ์ดํธ?
โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/moby/moby/issues/31101?email_source=notifications&email_token=ABOE6GA4CXY6ESMZMTDSFGDQC74CZA5CNFSM4DANZGS2YY3PNVWWK3TUL52HS4DFVEXG43VMXHJKTNMV
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABOE6GCEFFJ3SOLDWRWX2IDQC74CZANCNFSM4DANZGSQ
.
๋ชจ๋ ์ ๋ฐ์ดํธ?
๊ทธ๋์.. ๊ฑฐ์ 3๋
..
๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ด ์ฐฉ๋ฅํ๊ธฐ๋ฅผ ์ฌ์ ํ ํฌ๋งํฉ๋๋ค :D
๋ค์ ์ค์ง ์์ ๊ฒฝ์ฐ ํ์ฅํ ์ ์๋ ์ผ์ข
์ ๋์์ด ํ์ํฉ๋๋ค. ์ถ์ ์๋น์ค๋ฅผ ํ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ํ์ผ ํ์์ ๋จ์ํ๊ณ ๋ชจ๋ ์๋น์ค ์ ์ธ์ ํ๋์ ํ์ผ์ ์์ต๋๋ค. &
๋ฅผ ํตํด ๋
ธ๋์ ๋ํ ๋ณ์นญ์ ์ถ๊ฐํ๋ yaml์ ๊ธฐ๋ฅ๊ณผ ํจ๊ป ์ถ์ ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ <<:
์ฐ์ฐ์๋ฅผ ํตํด ํด๋น ๋ณ์นญ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ 3๋ !! ์๋ฌด๋ ์ ๊ฒฝ ์ฐ์ง ์๋ ์ผ์ ์ง์คํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ๋ํ ์ด๋ค ์ ๋ฐ์ดํธ?
์ด๊ฒ์ ํ์ฌํ ์ผ์
๋๋ค. Terraform์ ๊ตฌ์ฑ์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋์ ๊ฐ๋ฅํฉ๋๋ค. ์ compose๊ฐ ์ด ์ข์ ๋์์ธ ๊ดํ์ ๋ฐ๋ฅผ ์ ์์ต๋๊น?
Terraform ๋ชจ๋ ๊ตฌ์ฑ
Terraform ๋ชจ๋ฒ ์ฌ๋ก
"ํ์ฌํ", ์ข์.
@Cristian-Malinescu ๊ณ์ํด์ ๊ตฌํํ์ญ์์ค.
์ด๊ฒ์ ๋ฌด๋ฃ ๋ฐ ์คํ ์์ค ์ํํธ์จ์ด์
๋๋ค.
์ด ์ฑํ
์์ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ค์ฒ๋ผ ๋ถํํ๋ ๋์ .
๊ทธ๊ฒ์ ์ฌ๊ธฐ์ ์ด๋ค ๊ฐ์น๋ ์ถ๊ฐํ์ง ์์ต๋๋ค.
์ฌ๋ฌ ๋ฒ ๋งํ๋ฏ์ด ์ง๊ธ๊น์ง ์๋ฌด๋ ์ด๊ฒ์ ๊ตฌํํ๊ณ ์ถ์ง ์์์ต๋๋ค.
๊ทธ๋์ ๋ค๋ฅธ ์ฌ๋์ด k๋ฅผ ์์ ํด์ผ ํ๋ ๋ฌธ์ ์ผ ๋ฟ์
๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
@luckydonald @Cristian-Malinescu๋ฅผ ์ฝ๊ณ /์๋์ ์ด๋ฉฐ ๊ณต๊ฒฉ์ ์ธ ๋ต๋ณ์ผ๋ก ๋ฐ์ด
์ค๋ ๋๋ฅผ ํ์ด๋ณด๊ณ ์ง์๋๋ YAML ๊ธฐ๋ฅ์ ํ์ฉํ๋ ๊ฒ์ด ์ธ๊ธ๋์์ต๋๋ค.
์ด ์๊ฐ ๋์ ํ์ต๋๋ค .
@nomasprime ์ฐพ์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๋๋ ๋ด ํ๋ก์ ํธ๋ฅผ ์ํด v2์ v3 ์ฌ์ด์์ ๊ฒฐ์ ํ๊ณ ์์๊ณ ์ด๊ฒ์ ์ด ์ค๋ ๋์ ํฐ ๋๋ ๋ง๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ์ด๋ฌํ ๋์ฒด ์๋ฃจ์ ์ด ์๋น์ค ํ์ฅ ๊ธฐ๋ฅ์ ๋ํ ๊ณต์ ๋ฌธ์ ์ ์ธ๊ธ๋์ง ์์ ๊ฒ์
๋ฌธ์ ํ์ด์ง์ ์ค๋ฅธ์ชฝ ํ์ ๋ชจ์์ ์๋ Request docs changes
๋งํฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ข์ ๊ธฐํ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
@nomasprime ์, ๊ทธ ์์ด๋์ด๋ ์ด์ ์ ์ด ์ค๋ ๋์ ์์์ต๋๋ค.
๊ทธ๊ฒ์ด ๋ค๋ฅธ yml ํ์ผ์ ๋ํ ํ์ผ ๋ก๋ฉ ๋ฉ์ปค๋์ฆ๊ณผ ๊ฒฐํฉ๋ ์ ์๋ค๋ฉด, ๊ทธ๊ฒ์ด ๋ชจ๋ ์ด์ depends
๊ธฐ๋ฅ์ ๊ฐ๋ ๋ฐ ์ค์ ๋ก ํ์ํ ์ ๋ถ์
๋๋ค.
์ ์ฐธ์กฐ, ์: https://github.com/moby/moby/issues/31101#issuecomment -413323610
์์ฃผ _์ฝ์ ์ ์๋_ ๊ฒ์ ์๋์ง๋ง ์ ์ด๋ _๊ฐ๋ฅํ_ ๊ฒ์ ๋๋ค.
@nomasprime ์ฐพ์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๋๋ ๋ด ํ๋ก์ ํธ๋ฅผ ์ํด v2์ v3 ์ฌ์ด์์ ๊ฒฐ์ ํ๊ณ ์์๊ณ ์ด๊ฒ์ ์ด ์ค๋ ๋์ ํฐ ๋๋ ๋ง๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
@arseniybanayev ๋งค์ฒด์ ๋ํ ๊ธฐ์ฌ๋ v3์ ๋ํด์๋ง ์ค๋ช
ํ์ง๋ง v2์ ์ต์ ๋ฒ์ ์ docker-compose
ํ๊ณ swarm
์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ v2(๋ ๊ตฌ์ฒด์ ์ผ๋ก 2.4)๋ฅผ ์ ํํฉ๋๋ค(v3์ ์ปจํ
์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ ํ ๊ณผ ๊ฐ์ v2์ ์ผ๋ถ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์์ต๋๋ค).
v3๋ ์ปจํ ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ ํ๊ณผ ๊ฐ์ v2์ ์ผ๋ถ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์์ต๋๋ค.
v3๋ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ์ง์ํ์ง๋ง ํ๋๋ deploy -> resources -> limits
https://docs.docker.com/compose/compose-file/#resources ์๋์ ์์ต๋๋ค.
@thaJeztah ๋ด ๋ง์, docker-compose
์ ๋ํ ๊ฒ์
๋๋ค(์ด์ ์๊ฒฌ์์ ์ธ๊ธํ ํ๋ก์ ํธ์์ swarm์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์). IIRC ๋ฐฐํฌ๋ ์ค์ ์ ์ฉ์
๋๋ค.
Swarm๊ณผ Local์ ๋ํด ๋ณ๋์ ๊ตฌ์ฑ์ ๋ง๋๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๊น? ์ด ๋์ ์๋ก ์ถฉ๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋น์ฐํ Docker๋ Swarm ์ฌ์ฉ๋์ด ์ฆ๊ฐํ๊ธฐ๋ฅผ ์ํ์ง๋ง ๋ง์ ์ฌ๋๋ค์ด ๋ก์ปฌ ๊ฐ๋ฐ์ฉ์ผ๋ก๋ง compose๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ ๋ ECS, k8s ๋๋ GAE๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๋์ ํ๊ฒฝ์์ Swarm์ ์ฌ์ฉํ๊ณ ์ปจํ ์ด๋๋ฅผ ์คํํ ์ ์ด ์์ต๋๋ค.
๋๋ถ๋ถ์ ์ต์
์ swarm/kubernetes ์๋น์ค์ compose๋ฅผ ํตํด ๋ฐฐํฌ๋ ์ปจํ
์ด๋ ๋ชจ๋์ ๋ํด ๋ฒ์ญ ๊ฐ๋ฅ/์ฌ์ฉ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. memory
ํ๋๊ฐ docker-compose
์ ์ฉ๋์ง ์๋ ์ด์ ๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค.
์ฌ์ ํ ํ์ฅ ๊ธฐ๋ฅ์ด ์์ง๋ง ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก์์๋ COMPOSE_FILE
ํ๊ฒฝ์ ํตํด ์ฌ๋ฌ ๋์ปค ์์ฑ ํ์ผ๋ก ์ ํํ์ต๋๋ค. ๋๋ ์ฃผ๋ก ๋ค๋ฅธ ์ํธ ๋๋ ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ dev ๋ฐ prod์ ๋์ผํ ๊ธฐ๋ณธ docker-compose.yml์ ์ฌ์ฉํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
์์:
export COMPOSE_FILE=
docker-compose.yml` # ๊ธฐ๋ณธ๊ฐexport COMPOSE_FILE=
docker-compose. yml:docker-compose.prod.yml ` # ๋ yaml ํ์ผ์ ๋ชจ๋ ์ฌ์ฉdocker-compose.prod.yml
์์ env ๋ณ์๋ฅผ prod ์ํธ๋ก ๋ฎ์ด์๋๋ค.
์ด ์ค์ ์ ๊ฐ๋จํ๋ฉฐ docker-compose
๋ช
๋ น์ ํญ์ "-f"๋ฅผ ์ฌ๋ฌ ๊ฐ ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ๊ฐ๋ฐ์ ์ปดํจํฐ์ ์๋ฒ์์ COMPOSE_FILE
env var๋ฅผ ๋ค๋ฅด๊ฒ ์ค์ ํ๊ณ git์ docker-compose.prod.yml ํ์ผ์ ๋ฌด์ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์์ง ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค :)
๋๋ ์ด๊ฒ์ ํ์ฅํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ์ต๋๋ค.
docker-compose \
-f ./docker/base.yml \
-f ./docker/extended.yml \
up
๊ทธ๋ฌ๋ ํ์ผ์์ ํ์ฅํ๋ฉด ์ถ๊ฐ bash ์คํฌ๋ฆฝํธ๊ฐ ํ์ํ์ง ์์ต๋๋ค.
๋๋ ๋ํ ์ด๊ฒ์ ์ฌ์ฉํ์ฌ bash ์คํฌ๋ฆฝํธ์์ ๋์ ์ผ๋ก ํ์ฅํ์ต๋๋ค.
extended_docker_compose="
version: '3.5'
services:
my-service:
restart: always
"
echo "$extended_docker_compose" | docker-compose \
-f ./docker/base.yml \
-f /dev/stdin \
up
@dave-dm ๊ทธ๊ฒ๋ค์ ํ๋ฒํ ์ค๋๋ ์ฌ์ ์์ ๋๋ค!
๋๋ ์ด๊ฒ์ด ํ์ฅ์ ๋ํ ์ ์ฌ์ ์ธ ์ ํจํ ์ฌ์ฉ ์ฌ๋ก๋ผ๊ณ ์๊ฐํฉ๋๋ค.
https://github.com/NerdsvilleCEO/devtools/blob/master/doctl/docker-compose.yml#L10
์๋น์ค ํ๊ฒฝ์ ์ฌ์ฉํ๋ docker-compose
๋ํผ๊ฐ ์์ต๋๋ค. https://github.com/nowakowskir/docker-compose-wrapper
ํธ์ง: ๋ ๋ค๋ฅธ ๊ฐ๋ฅํ ์ฌ์ฉ ์ฌ๋ก๋ ๋๊ตฐ๊ฐ๊ฐ LAMP/LEMP ์คํ์ ๊ฐ์ง๊ณ ์๊ณ wordpress์ ๊ฐ์ ํน์ ์๋น์ค์ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ํด ํด๋น ์๋น์ค๋ฅผ ํ์ฅํ๋ ค๋ ๊ฒ์ ๋๋ค.
docker compose ๋์์ ํ์ํ๋ ๋์ ์ฌ์ ํ 2017๋ ๋ถํฐ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
@nomasprime ์, ๊ทธ ์์ด๋์ด๋ ์ด์ ์ ์ด ์ค๋ ๋์ ์์์ต๋๋ค.
๊ทธ๊ฒ์ด ๋ค๋ฅธ yml ํ์ผ์ ๋ํ ํ์ผ ๋ก๋ฉ ๋ฉ์ปค๋์ฆ๊ณผ ๊ฒฐํฉ๋ ์ ์๋ค๋ฉด, ๊ทธ๊ฒ์ด ๋ชจ๋ ์ด์
depends
๊ธฐ๋ฅ์ ๊ฐ๋ ๋ฐ ์ค์ ๋ก ํ์ํ ์ ๋ถ์ ๋๋ค.์ ์ฐธ์กฐ, ์: #31101(๋๊ธ)
์์ฃผ _์ฝ์ ์ ์๋_ ๊ฒ์ ์๋์ง๋ง ์ ์ด๋ _๊ฐ๋ฅํ_ ๊ฒ์ ๋๋ค.
@luckydonald ์ง์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด์ํ๊ฒ ๋ ๋ด์ฅ๋ YAML ํฌํจ ๊ธฐ๋ฅ ์ด ์๋ ๊ฒ์ ํ์คํ ๋ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ ๋๋ค.
ํ์ฌ ์๋ฃจ์ ์ ๊ตฌํํ๋ ๊ฒ์ ๊ฝค ์ฌ์ธ ๊ฒ ๊ฐ์ง๋ง ์ ์ด๊ฒ์ด v3๋ก ์ ๊ณต๋์ง ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค ๐คทโโ
๋ง์ ๋ถ๋ค์ด ์ด ๊ธฐ๋ฅ์ ์ํ์ ๋ค๋ ์ฌ์ค์ ์ด์ง ์๋ ค๋๋ฆฝ๋๋ค :)
v3 btw๋ก ์ด์ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์์ด๋ฒ๋ ธ๋๋ฐ ๋บ๊ธด ์ง์ง ์ด์ ๊ฐ ์๋์?
2020๋ 5์ 6์ผ ์์์ผ 23:14 Julien Marechal, [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋ง์ ๋ถ๋ค์ด ์ด ๊ธฐ๋ฅ์ ์ํ์ ๋ค๋ ์ฌ์ค์ ์ด์ง ์๋ ค๋๋ฆฝ๋๋ค :)
โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/moby/moby/issues/31101#issuecomment-624919070 ๋๋
๊ตฌ๋ ์ทจ์
https://github.com/notifications/unsubscribe-auth/ABOE6GGDIVGATP734YJA4UTRQHOLJANCNFSM4DANZGSQ
.
yaml ์ต์ปค๊ฐ ์ด ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ extend
๋นํด ์ฝ๊ฐ ๋ถํธํฉ๋๋ค. ์ ์๊ฐ์ ์ด ํ์ ์ฃผ๋ก ์์์ ์ฌ๊ท์ ๋ณํฉ์์ ๋น๋กฏ๋์์ต๋๋ค. ์ต์ปค๋ฅผ ์ฌ์ฉํ๋ฉด 75% ์ ๋ ์ป์ ์ ์์ต๋๋ค. yaml์ ์ฌ๊ท์ ์ผ๋ก ๋ณํฉํ์ง ์์ต๋๋ค. ๋ชจ๋ ๋ณํฉ์ ์ต์์ ์์ค์์ ๋ฐ์ํฉ๋๋ค. ๊ณ ์ ๋ ์๋น์ค ํ
ํ๋ฆฟ์ ์ฐธ์กฐํ ๋ค์ environment
๋ธ๋ก์ ์ฌ์ ์ํ๋ฉด ๋ณํฉ๋๋ ๋์ ๊ณ ์ ๋ ์๋น์ค์ ํ๊ฒฝ ๋ธ๋ก์ ๋ฎ์ด์ฐ๊ฒ ๋ฉ๋๋ค. extend
ํค์๋์ ๋์์ ์ผ์น์ํค๋ ค๋ฉด ์ฌ์ ์ ์ฌ๊ท ํธ๋ฆฌ ์๋๋ก ๋ชจ๋ ์ฌ์ ์ ๊ณ ์ ํ๊ณ ์ฐธ์กฐํด์ผ ํฉ๋๋ค.
์:
# anchors for the service, environment, deploy, and deploy.placement blocks
# you'll need an anchor for every dict that you want to merge into
x-common-app: &common-app
image: app:1.0
environment: &common-app-environment
common_option: a
overwrite_option: b
deploy: &common-app-deploy
max-replicas-per-host: 3
placement: &common-app-deploy-placement
constraints:
- 'node.labels.app_host==true'
services:
myapp: << *common-app
environment: << *common-app-environment
foo: bar
baz: xyzzy
overwrite_option: quz
deploy: << *common-app-deploy
replicas: 15
placement: << *common-app-deploy-placement
preferences:
- spread: node.labels.region
# The above yields the following:
services:
myapp:
image: app:1.0
environment:
common_option: a
overwrite_option: quz
foo: bar
baz: xyzzy
deploy:
replicas: 15
max-replicas-per-host: 3
placement:
constraints:
- 'node.labels.app_host==true'
preferences:
- spread: node.labels.region
์ด ์์ ์์๋ ๊ทธ๋ ๊ฒ ์ฑ๊ฐ์๊ฒ ๋ณด์ด์ง ์์ ์ ์์ง๋ง ํ๋์ ํ์ฅ ๋ธ๋ก์์ ์ฌ๋ฌ(10๊ฐ ์ด์) ์๋น์ค๋ฅผ ํ ํ๋ฆฟํํ๋ ๊ฒฝ์ฐ ์ฑ๊ฐ์๊ณ ๋ ์ฝ๊ธฐ ์ฝ์ต๋๋ค.
๋ด ๋ง์ ์์์ ์ด์์ ์ธ ์๋๋ฆฌ์ค๋ YAML ์ต์ปค ์ ๊ทผ ๋ฐฉ์์ ์กฐํฉ๊ณผ์
๋๋ค extend
์ ๊ทผ ๋ฐฉ์์ - ํ์ฉ extend
์ต๊ณ ์์ค์์๋ง ๋ณด๋ด๊ณ x-
๋ก, ์ ๋์ฌ ํ์ฅ ํ๋ ๋ธ๋ก ๋ ๋๋ํ ๋ณํฉ ํน์ฑ.
์ฐ๋ฆฌ ์กฐ์ง์์๋ yaml ์ต์ปค๊ฐ ๊ตฌ๋ฌธ์ ์ผ๋ก ์ฝ๊ฐ ์์ฑํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ฌ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ถ ํ์ด์ฌ ์คํฌ๋ฆฝํธ์์ extend
๊ธฐ๋ฅ์ ๋ค์ ๊ตฌํํ์ต๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ํจ๊ณผ์ ์ด์ง๋ง ๋ฌด์ธ๊ฐ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ์ ๋ฆ๋ฐ์ด ๋ฐฉ๋ฒ์
๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ฐ๋ฆฌ๋ v3/Swarm ์คํ์ ๋ํ depends_on
์ ๊ฑฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์์ฒด ์ธ๋ถ ๋๊ตฌ๋ฅผ ๋ง๋ค์ด์ผ ํ์ต๋๋ค.
์ต๊ทผ์ gitlab CI YAML์ ๋ง์ด ํ์ต๋๋ค. ์ฝ๊ธฐ ์ฝ๊ณ ๊ด๋ฆฌ ๊ฐ๋ฅํ ํ ํ๋ฆฟ๊ณผ ์ต์ข ๊ตฌ์ฑ์ ๋ฌ์ฑํ๋ ๋ฐ ์์ฃผ ์ข์ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
x-
์ด๊ณ gitlab CI์์๋ ์ด๊ธฐ .
์
๋๋ค.์ด๊ฒ์ ์ด๋ฌํ ํ์ผ์ ๊ฒฌ๋ ์ ์๊ฒ ํ๋ ์ ํํ ๊ธฐ๋ฅ ์ธํธ์ ๋๋ค.
๋์ปค ๋ฌธ์์์ ์ด ๋ฌธ์ ์ ๋๋ฌํ์ต๋๋ค. ์ ๊ฒฝ์ฐ์๋ docker-compose
์ค์ ์ ํ
ํ๋ฆฟํํ๊ณ ์ถ์๊ณ 'ํด๊ฒฐ ๋ฐฉ๋ฒ'์ผ๋ก ์์ ์กฐ์ธ์ ๋ฐ๋ผ ๊ธฐ์กด ํ
ํ๋ฆฟ ํ๋ก๊ทธ๋จ์ ์ฐพ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ด ์ค์ ๊ธฐ๋ฅ ์์ฒญ์ ๋ํ ๋
ผ์์ ์๊ด์์ด ์ฌ๊ธฐ์์ ์ฐพ์ ๋ด์ฉ์ ์กฐ๊ธ ๋ ์์ธํ ์ค๋ช
ํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ด๋ จ๋ ์ฌ๋๋ค์ YAML ๊ธฐ๋ฐ ํ
ํ๋ฆฟ ์์คํ
์ ์ฌ์ฉํ์ฌ ์ด ๊ธฐ๋ฅ์ docker-compose
์์ฒด์ ํตํฉํ๋ ๊ฒ๋ณด๋ค ์์ฑ ํ์ผ์ ์์ฑํ๋ ๊ฒ์ด ์บก์ํ ๋ฐ ์์
์ ์ ํฉํ ๋๊ตฌ ์ ํ ์ธก๋ฉด์์ ๋ ์ ์ ํ ์ ์์ต๋๋ค.
์ด๋ค ๋งฅ๋ฝ์์ ์ ๋ Let's Encrypt ๋ฐ ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋์ ํจ๊ป ๊ธฐ๋ณธ ์ญ ํ๋ก์๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค(์ง๊ธ์ Nextcloud, ์ ๋ฅผ ์ํ ๊ฒ, ์น๊ตฌ๋ฅผ ์ํ ๋ณ๋์ ์ปจํ ์ด๋). ๋งค์ฐ ์ ์ฌํ ์ค์ ์ ๋ํด ํค ์ ๋ ฅ์ผ๋ก ์ค์์ ์ค๋ณต์ ํผํฉ๋๋ค. ๋ค์ ํจํค์ง๋ ๋ด๊ฐ ์๋ํ ๊ฒ์ ๋๋ค.
ytt๋ ๋งค์ฐ ํฌ๊ด์ ์ธ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก YAML์ ์ฌ์ฉํ๋ ์ ์ผํ ์ต์ ์ ๋๋ค. ๊ฐ๋ ฅํ๊ณ ์์ ์ ์ ํฉํ ๋๊ตฌ๋ก ๋ณด์๊ณ Python์ ์์ ์งํฉ์ธ Starlark๋ฅผ ์ฌ์ฉํ์ฌ YAML ํ์ผ ๋ด๋ถ์์ ์ง์ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ง ์ง๋์ง ์์ ํ ํ๋ฆฟ์ ๋งค์ฐ ์ง์ ๋ถํด์ก์ผ๋ฉฐ ์ฝ๋ ์กฐ๊ฐ๊ณผ YAML ์กฐ๊ฐ์ด ํฉ์ด์ง๊ณ ์ฌ์ ๋ฐ ๋ฐฐ์ด ๋ฐ YAML ์กฐ๊ฐ๊ณผ ๊ฐ์ Python ๋ฐ์ดํฐ ์ ํ์ด ํผํฉ๋์์ต๋๋ค. ๋ฌธ์์ด๊ณผ ๊ฐ์ ํ๊ทธ๋ฅผ ์ถ๋ ฅํ๋ HTML ํ ํ๋ฆฟ ์์ง)์ ๊ฒฐ๊ตญ ๋๋ฌด ๋ง์ ์ค๋ฅ์ ๋๋ฌด ์ง์ ๋ถํ ํ์ผ์ ์ด๋ํ์ต๋๋ค. Dhall์ ๋ํ ๋งค์ฐ ํฌ๊ด์ ์ธ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ๋ค์ํ ํ์์ผ๋ก ์ถ๋ ฅํ ์ ์๋ ๊ณ ์ ํ ๋ชจ๊ตญ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ ํ๋ฆฟ ์์คํ ๋ณด๋ค ๋ฉํํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ฒ๋ผ ๋ณด์ด์ง๋ง ๊ตฌ๋ฌธ์ด ๊ธฐ๋ฅ์ ์ด๊ณ ๋งค์ฐ ์๊ฒฉํ๊ฒ ํ์ํ๋์ด ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๊ตฌ์กฐํ๋์ง ์์ YAML์ฉ ๊ฐ๋จํ ํ ํ๋ฆฟ์ ๊ฐ์น๋ณด๋ค ๋น ๋ฅด๊ฒ ๋ ๋ณต์กํด์ก์ต๋๋ค. JSON๊ณผ Haskell์ ํผํฉํ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ธ์ด์ ํ์ํ ์์ ์ ์ํํ๋ ๋ฐ ๋๋ฌด ๋ง์ ์๊ฐ์ด ํ์ํ์ต๋๋ค.
ํฅ๋ฏธ๋กญ๊ฒ๋ Dhall๊ณผ ytt ๋ชจ๋์์ ์ด๋ ค์ ๋ ์ ์ ๋งค๊ฐ๋ณ์ํ๋ ํ๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ ๋ค ์ถฉ๋ถํ ์ ์๋ํ์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ด ์ธ์คํด์ค์ ์ด๋ฆ์ด ์๋น์ค ์ด๋ฆ๊ณผ ๋ณผ๋ฅจ ์ด๋ฆ์ ๋ํ๋๋๋ก ํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๋ค์ ์ถ์ ํ์ต๋๋ค. ํด์์ ๊ฐ์ ๋ํ ์ธ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ฝ์ง๋ง ํค ์ด๋ฆ์ ์ด๋ฌํ ์ธ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ง์ ๋ถํ๊ฑฐ๋ ๊น๋ํ๊ฒ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์๊ณ Dhall์ ํ์ ์์ ์ฑ์ ์ ์ฉํ์ผ๋ฉฐ ์ด๋ ๋จ์ํ ๊ทธ ๊ฐ๋ ์ ์ด๊ธ๋ฉ๋๋ค. Jsonnet์ ์ฌ์ฉํ๋ฉด ์์ ๋๊ดํธ ์์ ๋ฃ๋ ๊ฒ์ฒ๋ผ ๊ฐ๋จํ์ต๋๋ค.
CUE์ Jsonnet์ ๋ ๋ค JSON ์งํฅ์ด์ง๋ง ๋ณํ๊ธฐ๋ฅผ ํตํด ์คํํ๋ ๊ฒ์ ์ ํ ์ด๋ ต์ง ์์ผ๋ฉฐ Dhall๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก CUE๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด ๋ง์ด ์์ผ๋ฉฐ Jsonnet์ ๋จ์ ์์ ํ์ด๋ฌ์ต๋๋ค. , ๊ทธ๊ฒ์ ์ด๋ฏธ ๊ณผ๋ํ๋ค๋ ๊ฒ์ด ๋ถ๋ช ํด์ก์ต๋๋ค. ์๋ง๋ ์ ๋๋ก ๋ฐฐ์ฐ๋ ๋ฐ ์๊ฐ์ด ํจ์ฌ ๋ ๊ฑธ๋ฆฌ๋ฉด ๋ ๋์ ์ต์ ์ด ๋ ๊ฒ์ ๋๋ค. ํ์ง๋ง CUE๋ ๋จ์ํ ํ ํ๋ฆฟ ์์ ๋ณด๋ค ์ ํจ์ฑ ๊ฒ์ฌ์ ์คํค๋ง์ ๋ ์ค์ ์ ๋๋ ๊ฒ ๊ฐ์์ ๋น ๋ฅด๊ฒ Jsonnet์ผ๋ก ์ด๋ํ์ฌ ์์ ์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์๋ฃํ์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ด ๋ชจ๋ ์์ ์ ์๋ฃํ ํ์์ผ ์ด ๋๊ตฌ๋ฅผ Liquid ํ๊ทธ ๋๋ ์ ์ฌํ HTML ํ ํ๋ฆฟ์ ๋จ์์ฑ๊ณผ ๋น๊ตํ๋ฉด์ ์ค์ ๋ก ์ฒ์๋ถํฐ Liquid๋ฅผ ์ฌ์ฉํ์ ์ ์์์ ๊นจ๋ฌ์์ต๋๋ค. ์ ๋ Jekyll ์ฌ์ดํธ์ ์ปจํ ์คํธ์์๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ ๋ฆฝ ์คํํ ํจํค์ง๋ฅผ ์ป์ ์ ์์์ง๋ง ๊ธฐ๋ณธ ๋ฃจํ ๋ฐ ๋ชฉ๋ก, ํํ์์ ์ ์๋ฆฌ ํ ์คํธ๋ก ๋ฐ๋ก ํ๊ฐํ ์ ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์๋ง๋ ์ด๋ ๊ฒ ํ์ ๊ฒ์ ๋๋ค. ์์ ์ ์์ด์๋ ํจ์ฌ ์ข์์ต๋๋ค. Jsonify๋ JSON์ ๋ํด ๋ ์ฐ์ํ ์ ์์ง๋ง Liquid๋ ์์ํ YAML์์ ์๋ํ ์ ์์ผ๋ฏ๋ก ํ์ผ์ ๋ค์ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ฉ๋๋ค.
+1 docker-compose๋ ์ด ํฐ์ผ์ด ๋ง์ ์์ ํ ์คํธ ํ๊ฒฝ์ k8๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ ์ง์ํ๊ธฐ ์ํด ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ ์ง์ฅ์์ ๊ตฌํํ ๋ง์ถคํ ์๋ฃจ์ ์ ๋ํ ์๊ฐ ์ค ํ๋์์ต๋๋ค. ๋๋ ์ข ์๋ฆฌ์ ํํ๋์ ํผํ๊ธฐ ์ํด ๋งค์ฐ ์กฐ์ฌํ์ง๋ง ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ฝค ๋นจ๋ฆฌ ์ ๋นํํ์ต๋๋ค. ์ฒ ํ์ ํ ๋ก (๊ตฌ์ฑ ๋ ์์ ๋ฑ)์ ์์์์ ๋ฒ์ด๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ถ๋ช ํ docker-compose๋ฅผ ๊ณ์ ์ฌ์ฉํ ์ ์๋ ์ฌ๋๋ค์ด ํ์ํฉ๋๋ค.
+1:+1:
dev
/ test
/ ci
ํ๊ฒฝ์์ ์ด ๊ธฐ๋ฅ์ ๋ง์ด ์ฌ์ฉํ๋๋ฐ ./config/{dev,test,ci}/compose.yaml
์ ํ์ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก์ ์๋ ์์ฑ ํ์ผ์์ ํ์ฅํ ์ ์์์ต๋๋ค. COMPOSE_ENV=dev
๊ฐ ์๋ .env
๊ฐ ์์ง๋ง ๊ฐ๋ฐ์๊ฐ ์ฌ์ ์ํ ์ ์์ผ๋ฉฐ ๋ถ๋ช
ํ ci
์์ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
๋๋ ๊ทธ ๊ธฐ๋ฅ์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๊ณ ๋น์ทํ ๊ฒ์ ํ ์ ์๋ ๊ฒ์ผ๋ก ๋์ฒดํ์ง ์๋ ๊ฒ์ ์ถฉ๊ฒฉ์ ๋ฐ์์ต๋๋ค. ์ด์ฉ๋ฉด ์ฐ๋ฆฌ๊ฐ jinja2๋ฅผ ์ฌ์ฉํ๊ณ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ ํ๋๋ก ํ์ฉํ ์๋ ์์ต๋๋ค. Docker-Compose๊ฐ ๋ ๊ฑด์กฐํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. :'(
extends
๋ v1.27(https://github.com/docker/compose/pull/7588)๋ถํฐ docker-compose
์ง์๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ๋ง์ด ์ฌ์ฉํ๋ ํ ๊ฐ์ง ์ฌ์ฉ ์ฌ๋ก๋ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ฝ๋๋ก ๋ฒ์ ํํ๋ ๊ฒ์ ๋๋ค. ๋ด docker dev ๋ฐ prod ์์ฑ ํ์ผ์ ๋ชจ๋ ๊ธฐ๋ณธ ์๋น์ค๋ง ๋์ด๋๊ณ ํ๊ทธ๊ฐ ์ง์ ๋ ์๋น์ค ์ด๋ฏธ์ง ๋ฒ์ ์ด ์๋ docker-images.yml์์ ํ์ฅ๋ฉ๋๋ค.
v3์์ ์ด์ ๋ํ ์ฌ์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๋ฟ๋ง ์๋๋ผ ๋ณ๊ฒฝ ๋ก๊ทธ์ "์ ๊ฑฐ๋์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ '์ ๊ทธ๋ ์ด๋ ๋ฐฉ๋ฒ'์ ์ฐธ์กฐํ์ธ์."๋ผ๊ณ ํ์๋ฉ๋๋ค. ์ ๋ "์ ๊ทธ๋ ์ด๋ ๋ฐฉ๋ฒ"์ ๋ณด๊ณ ์ ๊ทธ๋ ์ด๋ ๋ฐฉ๋ฒ์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ณด๊ณ "์์ธํ ๋ด์ฉ์ '์๋น์ค ํ์ฅ'์ ์ฐธ์กฐํ์ญ์์ค"๋ผ๊ณ ๋งํฉ๋๋ค. "์๋น์ค ํ์ฅ"์ผ๋ก ์ด๋ํ์ฌ ๋ง์นจ๋ด ๋ด ํ์ผ์ ํ์ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๊ฒ ๋์ง๋ง "์ด ํญ๋ชฉ์ด ์ ๊ฑฐ๋์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ณ๊ฒฝ ๋ก๊ทธ๋ฅผ ์ฐธ์กฐํ์ญ์์ค"๋ผ๊ณ ๋ง ํ์๋ฉ๋๋ค.
์ด ์์ ์์ ์ด๊ฒ์ ๋ฌธ์ ์์ฑ์๊ฐ ํ๊ณ ์๋ ์์ธํ ๋๋ด์ฒ๋ผ ๋ณด์ ๋๋ค.