Moby: Compose v3/๋„์ปค ์Šคํƒ ๋ฐฐํฌ์—์„œ 'ํ™•์žฅ' ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์› ์ถ”๊ฐ€

์— ๋งŒ๋“  2017๋…„ 02์›” 16์ผ  ยท  165์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: moby/moby

https://github.com/docker/compose/issues/4315 ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด docker-compose ์กด์žฌํ•˜๋Š” extends ๊ธฐ๋Šฅ์€ ๋‹จ์ ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์‚ฌ์šฉ์ž๋“ค ์‚ฌ์ด์—์„œ ์ธ๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ๊นŒ์ง€ ์—”์ง„์˜ Compose ํ˜•์‹ ๊ตฌํ˜„์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ v3๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Compose ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ํ‰๋ฉดํ™”ํ•˜๋ผ๊ณ  ์กฐ์–ธํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์žฅ๊ธฐ์ ์ธ ์†”๋ฃจ์…˜์ž…๋‹ˆ๊นŒ? ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช…ํ™•ํ•œ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

cc @dnephin @vdemeester

arestack kinfeature

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ณ€๊ฒฝ ๋กœ๊ทธ์— "์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ '์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐฉ๋ฒ•'์„ ์ฐธ์กฐํ•˜์„ธ์š”."๋ผ๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ €๋Š” "์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐฉ๋ฒ•"์„ ๋ณด๊ณ  ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋ณด๊ณ  "์ž์„ธํ•œ ๋‚ด์šฉ์€ '์„œ๋น„์Šค ํ™•์žฅ'์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค"๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. "์„œ๋น„์Šค ํ™•์žฅ"์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๋งˆ์นจ๋‚ด ๋‚ด ํŒŒ์ผ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜์ง€๋งŒ "์ด ํ•ญ๋ชฉ์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค"๋ผ๊ณ ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์ด๊ฒƒ์€ ๋ฌธ์„œ ์ž‘์„ฑ์ž๊ฐ€ ํ•˜๊ณ  ์žˆ๋Š” ์ž”์ธํ•œ ๋†๋‹ด์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  165 ๋Œ“๊ธ€

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 ๊ฐ„์— ์•ฝ๊ฐ„์˜ ์ฝ๊ธฐ ์‰ฌ์šด ๋ณ€ํ™˜์„ ๊ฐ–๋Š” ๋„ˆ๋ฌด ์ข‹์€ ๊ด€ํ–‰์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ๋‚˜๋Š”

  • ๊ธฐ๋ณธ ๊ทœ์น™์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ณตํ†ต docker-compose ํŒŒ์ผ
  • dev docker๋Š” ๊ทธ๊ฒƒ์„ ํ™•์žฅํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์‹œ์„ค์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์Šคํ…Œ์ด์ง• ๋„์ปค๋Š” ๊ณตํ†ต๋„ ํ™•์žฅํ•˜๊ณ  ์ด ํ™˜๊ฒฝ์„ ์œ„ํ•œ ์‹œ์„ค์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœ๋•์…˜ ๋„์ปค๋Š” ์ด ํ™˜๊ฒฝ, ํŠนํžˆ ์ปจํ…Œ์ด๋„ˆ ๋ณต์ œ, ๋‹ค์‹œ ์‹œ์ž‘์— ๋Œ€ํ•œ ๊ทœ์น™ ๋“ฑ์„ ์œ„ํ•œ ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ ๊ณตํ†ต ํ™•์žฅ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์™œ ์šฐ๋ฆฌ๊ฐ€ ์ด ํ‹ฐ์ผ“์—์„œ ์™„์ „ํ•œ ์žฌ์ž‘์„ฑ์„ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ๋” ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 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๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.
๋ชจ๋‘ ์ฆ๊ฑฐ์šด ์‹œ๊ฐ„ ๋˜์„ธ์š”โ˜ฎ๏ธ

ํŽธ์ง‘ํ•˜๋‹ค:

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, ์—ฌ๊ธฐ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค :D

+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 ํŒŒ์ผ์—์„œ ๋ช‡ ๊ฐ€์ง€ ๊ณตํ†ต ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๊ฐ๊ฐ ๊ณ ์œ  ํ•œ ํŠน์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • devel ํ™˜๊ฒฝ์€ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๋ฏ€๋กœ ๋” ๋น ๋ฅธ ๋นŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐœ๋ฐœ์ž ์ปดํ“จํ„ฐ์˜ ์•ฑ ์ฝ”๋“œ๋กœ ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•˜๊ณ  ์•ฑ์„ ์™ธ๋ถ€ ์„ธ๊ณ„์™€ ๊ฒฉ๋ฆฌํ•˜๋Š” ์ผ๋ถ€ ๋”๋ฏธ ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋นŒ๋“œ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • prod๋Š” ๋Œ€์‹  ์•ˆ์ •์„ฑ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋ฏ€๋กœ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์ปดํŒŒ์ผํ•˜๊ณ  ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์ด๋ฏธ์ง€ ์ž์ฒด์— ๋ฒˆ๋“ค๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ๋Š” ๋Š๋ฆฌ์ง€๋งŒ ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
  • test๋Š” prod์™€ ์ •ํ™•ํžˆ ๊ฐ™์€ ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜์ง€๋งŒ ์™ธ๋ถ€ ์„œ๋น„์Šค๋กœ๋ถ€ํ„ฐ ๊ฒฉ๋ฆฌ๋˜์–ด ์™ธ๋ถ€ ์„ธ๊ณ„๋ฅผ ์˜ค์—ผ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฐ„๋‹จํ•œ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ๋งค์šฐ ๋ฏผ์ฒฉํ•˜๊ณ  ์œ ์—ฐํ•œ DevOps ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ชจ๋“  ์‚ฌ๋žŒ์€ ์‚ฌ์šฉ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์•ฝ๊ฐ„์˜ ์กฐ์ •๋งŒ ํ•˜๋ฉด ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์—์„œ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ํ˜•์‹ v3์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ด๋™ํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ extends ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ .env ๋„ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ง€๊ธˆ์€ ์œ ์ง€ ๊ด€๋ฆฌ์˜ ์•…๋ชฝ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค( .env ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ๋” ๋งŽ์ด Swarm๊ณผ DRY ์ค‘์—์„œ ๊ฒฐ์ •ํ•  ๋•Œ ์ง€๊ธˆ์€ DRY๋ฅผ ์„ ํƒํ–ˆ์ง€๋งŒ ์–ธ์  ๊ฐ€๋Š” Swarm์ด ํ•„์š”ํ•˜๊ณ  ๋‘ ๊ธฐ๋Šฅ์ด ๋‹ค์‹œ ์ง€์›๋˜๋Š” ๋‚ ์ด ์˜ค๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค... โ˜บ๏ธ

... ๋˜๋Š” ์ตœ์†Œํ•œ 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๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์งง์€ ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์œ ํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๊ณตํ†ต/๊ณตํ†ต.yml

services:
  web:
    image: alpine:3.6
    build: .
    environment:
      DOMAIN:
      PREFIX:

dev/docker-compose.yml

services:
  web:
    ports:
      - "8080:8080"

prod/docker-compose.yml

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 ์— ์ผ๋ฐ˜์ ์ธ ๊ตฌ์„ฑ ์˜ต์…˜๊ณผ ์„œ๋น„์Šค๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • ํŠน์ • ๊ฐœ๋ฐœ ๊ตฌ์„ฑ ๋ฐ ์„œ๋น„์Šค(์˜ˆ: xdebug)์— 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์„ผํŠธ

-ํ•„๋ฆฌํฌ

์ œ ๊ฒฝ์šฐ์—๋Š” ์ด์ „์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  • common.yml
  • devel.yml -> common.yml ํ™•์žฅ
  • prod.yml -> common.yml ํ™•์žฅ
  • docker-compose.yml -> ๋กœ์ปฌ, ์ž์‹ ๋ฌด์‹œ, ์›ํ•˜๋Š” ํ™˜๊ฒฝ(devel ๋˜๋Š” prod)์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ.

์ œ๊ฐ€ ๋ชฐ๋ž๋˜ https://github.com/moby/moby/issues/31101#issuecomment -329482917 ๊ณผ https://github.com/moby/moby/issues/31101#issuecomment -329512231 ๋•๋ถ„์—, ์ด์ œ ๋‹ค๋ฅธ ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ v3์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • docker-compose.yml -> ์ด์ „์— common.yml์ด์—ˆ๋˜ ๊ฒƒ
  • devel.yml -> docker-compose.yml ์žฌ์ •์˜
  • prod.yml -> docker-compose.yml ์žฌ์ •์˜
  • docker-compose.override.yml -> ๋กœ์ปฌ, ์ž์‹ ๋ฌด์‹œ, ์›ํ•˜๋Š” ํ™˜๊ฒฝ(๊ฐœ๋ฐœ ๋˜๋Š” ์ƒ์‚ฐ)์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ.

๋˜ํ•œ 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 ํ•„ํ„ฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.
ํ•ด๊ฒฐ-์ž‘์„ฑ ๋„์ปค ์Šคํƒ ๋ฐฐํฌ -c docker-compose.yaml
(๋˜๋Š” 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 ๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ์กฐ: @ํ•ธ๋“œ์ฝ”๋“œ

์ตœ์‹  ๋นŒ๋“œ ์‚ฌ์šฉ

  • ๋„์ปค 17.09.0-ce
  • ๋„์ปค ์ž‘์„ฑ 1.17.0dev

์ด์ œ _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
  1. ์˜ค๋ž˜๋œ ์Šคํƒ ์ œ๊ฑฐ
  2. ์ œ๊ฑฐ ๊ฐ€๋Šฅํ•œ ์Šคํƒ์ด ์ „ํŒŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  3. ์•ต์ปค๋ฅผ ์ผ๋ฐ˜ ์ •์˜์— ์‚ฝ์ž…ํ•˜๊ณ  tmp ํŒŒ์ผ์— ์ €์žฅ
  4. ํŒŒ์ผ์—์„œ ํ™˜๊ฒฝ ํŒŒ์ผ ๋ณ€์ˆ˜ ์ฝ๊ธฐ+์„ค์ •
  5. docker-compose๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ ํŒŒ์ผ์„ ํ•จ๊ป˜ ๋ณ‘ํ•ฉํ•˜์‹ญ์‹œ์˜ค.
  6. ๋ณ‘ํ•ฉ๋œ ํŒŒ์ผ ๋ฐฐํฌ

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์— ํฌํ•จ๋˜์ง€ ์•Š์€ ์ด์œ ์— ๋Œ€ํ•œ ์„ค๋ช…๋„ ์ฝ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฏฟ๋Š” ๊ณ ๊ฐ์„ ์œ„ํ•ด ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ํ†ต์‹ ์กฐ์ฐจ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์†Œํ”„ํŠธ์›จ์–ด์˜ ์Šฌํ”ˆ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

์ƒํ™ฉ์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ํ•ด์„(๋ฐ ์•„๋งˆ๋„ ํ˜„์žฌ ์Šค๋ ˆ๋“œ์˜ ์š”์•ฝ)์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • YAML ์•ต์ปค/์ฐธ์กฐ์™€ 3.4์˜ ํ™•์žฅ ํ•„๋“œ ๋Š” ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์ค‘ ํŒŒ์ผ์ด ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์—์„œ ๊ฐ„๋‹จํ•œ 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
  1. ๊ณตํ†ต ๋ถ€๋ถ„์œผ๋กœ /data/docker-compose.yml์„ ์ฝ์Šต๋‹ˆ๋‹ค.
  2. ๋ชจ๋“  docker compose๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ฐพ์Šต๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด ์ด ํ”„๋กœ์ ํŠธ์—๋Š” ์•ฝ 40๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ/docker-compose.yml ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค)
  3. ๊ฐ docker-compose.yml ์•ž์— /data/docker-compose.yml ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ณ‘ํ•ฉ
  5. /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 ์•ต์ปค ๋ฐ ๋ณ‘ํ•ฉ์„ ํ†ตํ•ด ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



ํ˜„์žฌ ์ž‘์„ฑ v2.1+
# /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




์ž‘์„ฑ v3.X์˜ ์•„์ด๋””์–ด
# /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 ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • ๋˜๋Š”: ๋ช…๋ น ์ˆ˜์ค€์—์„œ ์—ฐ๊ฒฐ _vs_ ํŒŒ์ผ ์ˆ˜์ค€์—์„œ ์—ฐ๊ฒฐ.

๋ช…๋ น์ค„์—์„œ ์ž‘์—…ํ•  ๋•Œ๋งŒ ๋ถˆํŽธ์ด ๋ˆˆ์— ๋„๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ž ์‹œ ๊ทธ๊ฒƒ์„ ์ธ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ์–ด์จŒ๋“  ์Šคํฌ๋ฆฝํŒ… ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ ์‹ค์ œ ์ธ์ˆ˜์˜ ๊ฒฝ์šฐ 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์„ ๋งŽ์ด ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์‰ฝ๊ณ  ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ํ…œํ”Œ๋ฆฟ๊ณผ ์ตœ์ข… ๊ตฌ์„ฑ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ์•„์ฃผ ์ข‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ 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์—์„œ ์ด์— ๋Œ€ํ•œ ์‰ฌ์šด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰