์ด์ œ ์ผ๋ฐ˜ Dockerfile์„ ์‚ฌ์šฉํ•˜์—ฌ werf์—์„œ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋Šฆ๊ฒŒํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค. ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์ผ๋ฐ˜ Dockerfile์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ์‹ฌ๊ฐํ•œ ์‹ค์ˆ˜๋ฅผ ์ €์ง€๋ฅผ ๋ป”ํ•œ ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ผ๋ฐ˜ Dockerfile์„ ์‚ฌ์šฉํ•˜์—ฌ werf์—์„œ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š”์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ์›Œํ”„ โ€” ๋ชจ๋“  CI/CD ์‹œ์Šคํ…œ๊ณผ ํ†ตํ•ฉ๋˜๊ณ  ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜๋ช…์ฃผ๊ธฐ์— ๋Œ€ํ•œ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” GitOps ์œ ํ‹ธ๋ฆฌํ‹ฐ๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋ฏธ์ง€๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๊ฒŒ์‹œํ•˜๋ฉฐ,
  • Kubernetes์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ ,
  • ํŠน๋ณ„ ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.


์ด ํ”„๋กœ์ ํŠธ์˜ ์ฒ ํ•™์€ DevOps ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๋„๊ตฌ๋ฅผ ๋‹จ์ผ ํ†ตํ•ฉ ์‹œ์Šคํ…œ์œผ๋กœ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๊ธฐ์กด ์œ ํ‹ธ๋ฆฌํ‹ฐ(์˜ˆ: Helm ๋ฐ Docker)๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์—†๋‹ค๋ฉด ์ด์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ๋งŒ๋“ค๊ณ  ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ: ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€ ์ˆ˜์ง‘๊ธฐ

์ด๋Š” werf์˜ ์ด๋ฏธ์ง€ ์ˆ˜์ง‘๊ธฐ์—์„œ ๋ฐœ์ƒํ•œ ์ผ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ Dockerfile๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ์ด๋ ฅ์„ ์ž ๊น ์‚ดํŽด๋ณด๋ฉด ์ด ๋ฌธ์ œ๋Š” werf์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์—์„œ ์ด๋ฏธ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค(๊ทธ ์ดํ›„์—๋„ ์—ฌ์ „ํžˆ). dapp์œผ๋กœ ์•Œ๋ ค์ง„).

Docker ์ด๋ฏธ์ง€์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋™์•ˆ ์šฐ๋ฆฌ๋Š” Dockerfile์ด ๋ช‡ ๊ฐ€์ง€ ๋งค์šฐ ํŠน์ •ํ•œ ์ž‘์—…์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊ธˆ๋ฐฉ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ ํ‘œ์ค€ ์ฒด๊ณ„์— ๋”ฐ๋ผ ์ผ๋ฐ˜์ ์ธ ์†Œ๊ทœ๋ชจ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์‹œ์Šคํ…œ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๊ณ ,
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…์†์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒˆ๋“ค์„ ์„ค์น˜ํ•˜๊ณ ,
    • ์ž์‚ฐ์„ ์ˆ˜์ง‘ํ•˜๊ณ ,
    • ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด๋ฏธ์ง€์˜ ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋นŒ๋”๋Š” ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์— ํŒจ์น˜๋ฅผ ์ ์šฉํ•˜์—ฌ ์‹ ์†ํ•˜๊ฒŒ ์ƒˆ ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ํŠน์ • ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ํ•ด๋‹น ์ข…์† ๋‹จ๊ณ„๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  ์šฐ๋ฆฌ ์ˆ˜์ง‘๊ฐ€์—๊ฒŒ๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์ดˆ๊ธฐ ์š•๊ตฌ์ด์ž ์ถฉ๋™์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋‘ ๋ฒˆ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๋ฌด์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. (์•„๋ž˜ ์ฐธ์กฐ) ๊ตฌํ˜„์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ DSL! ๋ชฉํ‘œ์— ๋”ฐ๋ผ ์กฐ๋ฆฝ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•˜๊ณ  ํŒŒ์ผ์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ๋‹จ๊ณ„์˜ ์ข…์†์„ฑ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๋ณด์™„ํ•œ ์ž์‹ ์˜ ์ˆ˜์ง‘๊ฐ€, ์ด๋Š” DSL์„ ์ตœ์ข… ๋ชฉํ‘œ์ธ ์กฐ๋ฆฝ๋œ ์ด๋ฏธ์ง€๋กœ ๋ฐ”๊พธ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์— DSL์€ Ruby์— ์žˆ์—ˆ์ง€๋งŒ Golang์œผ๋กœ ์ „ํ™˜ โ€” ์ˆ˜์ง‘๊ธฐ ๊ตฌ์„ฑ์ด YAML ํŒŒ์ผ์— ์„ค๋ช…๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ผ๋ฐ˜ Dockerfile์„ ์‚ฌ์šฉํ•˜์—ฌ werf์—์„œ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Ruby์˜ dapp์— ๋Œ€ํ•œ ์ด์ „ ๊ตฌ์„ฑ

์ด์ œ ์ผ๋ฐ˜ Dockerfile์„ ์‚ฌ์šฉํ•˜์—ฌ werf์—์„œ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
YAML์˜ werf์— ๋Œ€ํ•œ ํ˜„์žฌ ๊ตฌ์„ฑ

์ˆ˜์ง‘๊ธฐ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜๋„ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๊ตฌ์„ฑ์—์„œ ์ฆ‰์„์—์„œ ์ž„์‹œ Dockerfile์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์ž„์‹œ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์–ด์…ˆ๋ธ”๋ฆฌ ์ง€์นจ์„ ์‹คํ–‰ํ•˜๊ณ  ์ปค๋ฐ‹ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

NB: ํ˜„์žฌ ์ž์ฒด ๊ตฌ์„ฑ(YAML)์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  Stapel ์ˆ˜์ง‘๊ธฐ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ˆ˜์ง‘๊ธฐ๋Š” ์ด๋ฏธ ์ƒ๋‹นํžˆ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์„ค๋ช…์€ ๋ณ„๋„์˜ ๊ธฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ๊ธฐ๋ณธ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜.

๋ฌธ์ œ์˜ ์ธ์‹

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ํ•œ ๊ฐ€์ง€ ์‹ค์ˆ˜๋ฅผ ์ €์งˆ๋ €๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๊นจ๋‹ซ์ง€๋Š” ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ Dockerfile์„ ํ†ตํ•ด ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋™์ผํ•œ ์—”๋“œ ํˆฌ ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€๋ฆฌ ์ธํ”„๋ผ์— ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ์ด๋ฏธ์ง€ ์ˆ˜์ง‘, ๋ฐฐํฌ ๋ฐ ์ •๋ฆฌ). Kubernetes์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๊ณ  Dockerfile ์ง€์›์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํ‘œ์ค€ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?..

์šฐ๋ฆฌ๋Š” ์ด ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ๋Œ€์‹  ํ•ด๊ฒฐ์ฑ…์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. Dockerfile(๋˜๋Š” Dockerfile ์„ธํŠธ)์ด ์ด๋ฏธ ์žˆ๊ณ  werf๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

NB: ๊ทธ๋Ÿฐ๋ฐ ์™œ werf๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‚˜์š”? ์ฃผ์š” ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค.

  • ์ด๋ฏธ์ง€ ์ •๋ฆฌ๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€๋ฆฌ ์ฃผ๊ธฐ;
  • ๋‹จ์ผ ๊ตฌ์„ฑ์—์„œ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€์˜ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ
  • Helm ํ˜ธํ™˜ ์ฐจํŠธ์˜ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋” ์™„์ „ํ•œ ๋ชฉ๋ก์€ ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ŠคํŠธ๋ž˜๋‹ˆ์ฒด ํ”„๋กœํ…ํ„ฐ.

๋”ฐ๋ผ์„œ ์ด์ „์— ๊ตฌ์„ฑ์—์„œ Dockerfile์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ฒ ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ๋‹ค๋ฉด ์ด์ œ๋Š” "Werf๊ฐ€ Dockerfile์„ ๋นŒ๋“œํ•˜๋„๋ก ํ•˜์„ธ์š”!"๋ผ๊ณ  ๊ธฐ์˜๊ฒŒ ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€?

์ด ๊ธฐ๋Šฅ์˜ ์ „์ฒด ๊ตฌํ˜„์€ ๋ฆด๋ฆฌ์Šค์— ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. werf v1.0.3-beta.1. ์ผ๋ฐ˜์ ์ธ ์›์น™์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” werf ๊ตฌ์„ฑ์—์„œ ๊ธฐ์กด Dockerfile์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. werf build...๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. werf๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ์กฐ๋ฆฝํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถ”์ƒ์ ์ธ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ๋ฐœํ‘œํ•˜์ž Dockerfile ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์—์„œ:

FROM ubuntu:18.04
RUN echo Building ...

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋ฐœํ‘œํ•  ๊ฒƒ์ด๋‹ค werf.yaml์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” Dockerfile:

configVersion: 1
project: dockerfile-example
---
image: ~
dockerfile: ./Dockerfile

๋ชจ๋‘! ์™ผ์ชฝ ๋‹ฌ๋ฆฌ๋‹ค werf build:

์ด์ œ ์ผ๋ฐ˜ Dockerfile์„ ์‚ฌ์šฉํ•˜์—ฌ werf์—์„œ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‹ค์Œ์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. werf.yaml ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ Dockerfile์—์„œ ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

configVersion: 1
project: dockerfile-example
---
image: backend
dockerfile: ./dockerfiles/Dockerfile-backend
---
image: frontend
dockerfile: ./dockerfiles/Dockerfile-frontend

๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ๋นŒ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ „๋‹ฌ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. --build-arg ะธ --add-host - werf ๊ตฌ์„ฑ์„ ํ†ตํ•ด. Dockerfile ์ด๋ฏธ์ง€ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ „์ฒด ์„ค๋ช…์€ ๋‹ค์Œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค๋ช…์„œ ํŽ˜์ด์ง€.

์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค ์ค‘์— Docker์—์„œ ๋กœ์ปฌ ๋ ˆ์ด์–ด์˜ ํ‘œ์ค€ ์บ์‹œ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ค‘์š”ํ•œ ๊ฒƒ์€ werf๋„ Dockerfile ๊ตฌ์„ฑ์„ ์ธํ”„๋ผ์— ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค.. ์ด๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธ ํ•˜๋Š”๊ฐ€?

  1. Dockerfile์—์„œ ๋นŒ๋“œ๋œ ๊ฐ ์ด๋ฏธ์ง€๋Š” dockerfile (werf์˜ ์–ด๋–ค ๋‹จ๊ณ„์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—).
  2. ๋ฌด๋Œ€์šฉ dockerfile werf๋Š” Dockerfile ๊ตฌ์„ฑ์˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ ์„œ๋ช…์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Dockerfile ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋‹จ๊ณ„ ์„œ๋ช…์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. dockerfile Werf๋Š” ์ƒˆ๋กœ์šด Dockerfile ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋‹จ๊ณ„์˜ ์žฌ๊ตฌ์ถ•์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ช…์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด werf๋Š” ์บ์‹œ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. (werf์—์„œ ์„œ๋ช… ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด ๋ณด๊ณ ์„œ).
  3. ๋‹ค์Œ์œผ๋กœ ์ˆ˜์ง‘๋œ ์ด๋ฏธ์ง€๋Š” ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. werf publish (๋˜๋Š” werf build-and-publish) ์ด๋ฅผ Kubernetes ๋ฐฐํฌ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Docker ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๊ฒŒ์‹œ๋œ ์ด๋ฏธ์ง€๋Š” ํ‘œ์ค€ werf ์ •๋ฆฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ์ด๋ฏธ์ง€(N์ผ ์ด์ƒ), ์กด์žฌํ•˜์ง€ ์•Š๋Š” Git ๋ถ„๊ธฐ์™€ ์—ฐ๊ฒฐ๋œ ์ด๋ฏธ์ง€ ๋ฐ ๊ธฐํƒ€ ์ •์ฑ…์€ ์ž๋™์œผ๋กœ ์ •๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์„ค๋ช…๋œ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„ค๋ช…์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜ ์‚ฌํ•ญ

1. ADD์—์„œ๋Š” ์™ธ๋ถ€ URL์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ง€์‹œ๋ฌธ์—์„œ ์™ธ๋ถ€ URL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ADD. Werf๋Š” ์ง€์ •๋œ URL์˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์žฌ๊ตฌ์ถ•์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณง ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

2. ์ด๋ฏธ์ง€์— .git์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋””๋ ‰ํ† ๋ฆฌ ์ถ”๊ฐ€ .git ์ด๋ฏธ์ง€์—์„œ - ์•…์˜์ ์ธ ๋‚˜์œ ์Šต๊ด€์ด๋ฉฐ ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ฉด .git ์ตœ์ข… ์ด๋ฏธ์ง€์— ๋‚จ์•„ ์žˆ์œผ๋ฉด ์›์น™์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค. 12ํŒฉํ„ฐ ์•ฑ: ์ตœ์ข… ์ด๋ฏธ์ง€๋Š” ๋‹จ์ผ ์ปค๋ฐ‹์— ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. git checkout ์ž„์˜ ์ปค๋ฐ‹.
  2. .git ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(๋Œ€ํ˜• ํŒŒ์ผ์ด ํ•œ ๋ฒˆ ์ถ”๊ฐ€๋œ ํ›„ ์‚ญ์ œ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ €์žฅ์†Œ๊ฐ€ ์ปค์งˆ ์ˆ˜ ์žˆ์Œ). ํŠน์ • ์ปค๋ฐ‹๊ณผ ๊ด€๋ จ๋œ ์ž‘์—… ํŠธ๋ฆฌ์˜ ํฌ๊ธฐ๋Š” Git์˜ ์ž‘์—… ๊ธฐ๋ก์— ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ถ”๊ฐ€ ๋ฐ ํ›„์† ์ œ๊ฑฐ .git ์ตœ์ข… ์ด๋ฏธ์ง€์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋Š” ์—ฌ์ „ํžˆ ์ถ”๊ฐ€ ๋ ˆ์ด์–ด๋ฅผ ํš๋“ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Docker๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  3. Docker๋Š” ๋™์ผํ•œ ์ปค๋ฐ‹์ด ๋นŒ๋“œ๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์ž‘์—… ํŠธ๋ฆฌ์—์„œ ๋ถˆํ•„์š”ํ•œ ์žฌ๊ตฌ์ถ•์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด GitLab์€ ๋‹ค์Œ ์œ„์น˜์— ๋ณ„๋„์˜ ๋ณต์ œ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. /home/gitlab-runner/builds/HASH/[0-N]/yourproject ๋ณ‘๋ ฌ ์กฐ๋ฆฝ์ด ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ. ์ถ”๊ฐ€ ์žฌ์กฐ๋ฆฝ์€ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ .git ๋™์ผํ•œ ์ปค๋ฐ‹์ด ๋นŒ๋“œ๋˜๋”๋ผ๋„ ๋™์ผํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋ณต์ œ๋œ ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ์š”์ ์€ werf๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. Werf์—์„œ๋Š” ์ผ๋ถ€ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ๋นŒ๋“œ๋œ ์บ์‹œ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: werf deploy). ์ด๋Ÿฌํ•œ ๋ช…๋ น์ด ์‹คํ–‰๋˜๋ฉด werf๋Š” ๋‹ค์Œ์— ์ง€์ •๋œ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์Šคํ…Œ์ด์ง€ ์„œ๋ช…์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. werf.yaml, ์–ด์…ˆ๋ธ”๋ฆฌ ์บ์‹œ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ช…๋ น์ด ๊ณ„์† ์ž‘๋™ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌด๋Œ€ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ๋‚ด์šฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ .git, ๊ทธ๋Ÿฌ๋ฉด ๊ด€๋ จ ์—†๋Š” ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ์— ๋ถˆ์•ˆ์ •ํ•œ ์บ์‹œ๋ฅผ ์–ป๊ฒŒ ๋˜๋ฉฐ werf๋Š” ์ด๋Ÿฌํ•œ ์‹ค์ˆ˜๋ฅผ ์šฉ์„œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”). ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜).

์ผ๋ฐ˜์ ์œผ๋กœ, ํŠน์ • ํ•„์ˆ˜ ํŒŒ์ผ๋งŒ ์ถ”๊ฐ€ ์ง€์‹œ์‚ฌํ•ญ์„ ํ†ตํ•ด ADD ์–ด์จŒ๋“  ์„œ๋ฉด์˜ ํšจ์œจ์„ฑ๊ณผ ์‹ ๋ขฐ์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. Dockerfile, ๋˜ํ•œ ์ด๋ฅผ ์œ„ํ•ด ์ˆ˜์ง‘๋œ ์บ์‹œ์˜ ์•ˆ์ •์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. Dockerfile, Git์˜ ๊ด€๋ จ์—†๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ.

ํ•ฉ๊ณ„

ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๋Š” ์ž์ฒด ๋นŒ๋”๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ดˆ๊ธฐ ๊ฒฝ๋กœ๋Š” ์–ด๋ ต๊ณ  ์ •์งํ•˜๋ฉฐ ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ Dockerfile ์œ„์— ๋ชฉ๋ฐœ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์†”๋ฃจ์…˜์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Stapel ์ˆ˜์ง‘๊ฐ€๋Š” ์ž‘์—…์— ์™„๋ฒฝํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ž์ฒด ๋นŒ๋”๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ธฐ์กด Dockerfile์— ๋Œ€ํ•œ ์ง€์›์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฐํ•จ์€ ์ด์ œ ์ˆ˜์ •๋˜์—ˆ์œผ๋ฉฐ ์•ž์œผ๋กœ ๋ถ„์‚ฐ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฐ Kubernetes๋ฅผ ์‚ฌ์šฉํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ(์ฆ‰, kaniko์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ Kubernetes ๋‚ด๋ถ€ ๋Ÿฌ๋„ˆ์—์„œ ์–ด์…ˆ๋ธ”๋ฆฌ)๋ฅผ ์œ„ํ•œ ๋งž์ถคํ˜• Stapel ๋นŒ๋”์™€ ํ•จ๊ป˜ Dockerfile ์ง€์›์„ ๊ฐœ๋ฐœํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐ‘์ž๊ธฐ ๋‘ ๊ฐœ์˜ Dockerfile์ด ์ฃผ๋ณ€์— ๋†“์—ฌ ์žˆ๋‹ค๋ฉด... ์‹œ๋„ํ•˜๋‹ค ์›Œํ”„!

PS ์ฃผ์ œ์— ๊ด€ํ•œ ๋ฌธ์„œ ๋ชฉ๋ก

์šฐ๋ฆฌ ๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ฝ์–ด๋ณด์„ธ์š”: โ€œwerf - Kubernetes์˜ CI/CD์šฉ ๋„๊ตฌ(๊ฐœ์š” ๋ฐ ๋น„๋””์˜ค ๋ณด๊ณ ์„œ)".

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€