2์ฃผ์ฐจ ์ •๋ฆฌ(Pre-commit, Github Action, Pytest, Docker)

yeonddoriยท2023๋…„ 3์›” 11์ผ
0

AID_WEB

๋ชฉ๋ก ๋ณด๊ธฐ
3/14

๐Ÿ“ Git Hooks

Git Hooks๋Š” Git๊ณผ ๊ด€๋ จํ•œ ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ํŠน์ • ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์ด๋Š” ํด๋ผ์ด์–ธํŠธ ํ›… ๊ณผ ์„œ๋ฒ„ ํ›… ์œผ๋กœ ๋‚˜๋‰˜๋Š”๋ฐ, ํด๋ผ์ด์–ธํŠธ ํ›…์€ ์ปค๋ฐ‹์ด๋‚˜ Mergeํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰ํ•˜๋Š” ํ›…์ด๋‹ค. ๋ฐ˜๋ฉด ์„œ๋ฒ„ ํ›… ์€ Git repository๋กœ pushํ•  ๋•Œ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•˜๋Š” ํ›…์ด๋‹ค.

Git hooks์˜ ์ข…๋ฅ˜

  • applypatch-msg
  • commit-msg
  • fsmonitor-watchman
  • post-update
  • pre-applypatch
  • pre-commit
  • pre-merge-commit
  • pre-push
  • pre-rebase
  • pre-receive
  • prepare-commit-msg
  • push-to-checkout
  • update

๐Ÿ“ Pre-commit

Git hook์—์„œ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ ์ค‘ pre-commit hook์„ ๊ด€๋ฆฌํ•˜๊ณ  ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, lint๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ, ๋ผ์ธ ๋ ๊ณต๋ฐฑ ๋ฌธ์ž ๊ฒ€์‚ฌ, ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ์˜ ์ฃผ์„ ๊ฒ€์‚ฌ ๋“ฑ commitํ•  ๋•Œ ๊ผญ ํ™•์ธํ•ด์•ผ ํ•  ๊ฒƒ์ด ์žˆ์œผ๋ฉด pre-commit hook์„ ํ†ตํ•ด ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

ํŠน์ง•

  • commitํ•  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ํ˜ธ์ถœ๋˜๋Š” hook
  • commit message๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœ
  • commitํ•˜๋Š” snapshot ๊ฒ€์‚ฌ
  • ๋น ๋œจ๋ฆฐ ๊ฒƒ์€ ์—†๋Š”์ง€, ํ…Œ์ŠคํŠธ ์œ ๋ฌด ์ ๊ฒ€
  • exit๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด commit ์ทจ์†Œ
  • git commit --no-verify๋ฅผ ํ†ตํ•ด hook ์ผ์‹œ์ ์œผ๋กœ ์ƒ๋žต ๊ฐ€๋Šฅ

์„ค์น˜ ๋ฐฉ๋ฒ•

pip ์ด์šฉ ์‹œ
pip install pre-commit

homebrew ์ด์šฉ ์‹œ
brew install pre-commit

conda ์ด์šฉ ์‹œ
conda install -c conda-forge pre-commit

๐Ÿ“ Github Action

GitHub Action์€ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌ ๋“ฑ์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” CI/CD ํ”Œ๋žซํผ์œผ๋กœ, workflow๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.

  • CI/CD
    ํ†ต์ƒ์ ์œผ๋กœ ์ž‘์—…ํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๊ณ , ์ €์žฅ์†Œ์— ์ „๋‹ฌ ํ›„ ๋ฐฐํฌ๊นŒ์ง€ ํ•˜๋Š” ๊ณผ์ •์„ ๋œปํ•œ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ

  • Workflow
    ํ•˜๋‚˜ ์ด์ƒ์˜ Job์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ณ , ์ด๋ฒคํŠธ์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋  ๋•Œ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์ˆ˜๋™์œผ๋กœ ๋˜๋Š” ์ •์˜๋œ ์ผ์ •์— ๋”ฐ๋ผ ํŠธ๋ฆฌ๊ฑฐ๋  ์ˆ˜ ์žˆ๋Š” ์ž๋™ํ™”๋œ ์ ˆ์ฐจ๋ฅผ ๋งํ•œ๋‹ค. workflow๋Š” Github repository์˜ .github/workflows ํด๋” ์•„๋ž˜์— YAML ํŒŒ์ผ๋กœ ์ €์žฅ๋œ๋‹ค. Github์— YAML ํŒŒ์ผ๋กœ ์ •์˜ํ•œ ์ž๋™ํ™” ๋™์ž‘์„ ์ „๋‹ฌํ•˜๋ฉด, Github Action์€ ํ•ด๋‹น ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ทธ๋Œ€๋กœ ์‹คํ–‰์‹œํ‚จ๋‹ค.

  • Event
    workflow๋ฅผ ์‹คํ–‰์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ํŠน์ • ํ™œ๋™์ด๋‚˜ ๊ทœ์น™์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ commit์„ repository์— pushํ•˜๊ฑฐ๋‚˜ pull ์š”์ฒญ์ด ์ƒ์„ฑ ๋  ๋•Œ GitHub์—์„œ ํ™œ๋™์ด ์‹œ์ž‘๋  ์ˆ˜ ์žˆ๋‹ค.

  • Job
    Job์€ ์—ฌ๋Ÿฌ Step์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ณ , ๋‹จ์ผ ๊ฐ€์ƒ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋œ๋‹ค. ๋‹ค๋ฅธ Job์— ์˜์กด ๊ด€๊ณ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๊ณ , ๋…๋ฆฝ์ ์œผ๋กœ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋  ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ข…์†์„ฑ์ด ์—†๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ๋นŒ๋“œ ์ž‘์—…๊ณผ ์ด๋Ÿฌํ•œ ์ž‘์—…์— ์ข…์†๋œ ํŒจํ‚ค์ง• ์ž‘์—…์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋นŒ๋“œ ์ž‘์—…์€ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜๋ฉฐ ๋ชจ๋‘ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ํŒจํ‚ค์ง• ์ž‘์—…์ด ์‹คํ–‰๋œ๋‹ค.

  • Step
    Job ์•ˆ์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค ๋‹จ์œ„๋กœ, step์—์„œ ๋ช…๋ น์„ ๋‚ด๋ฆฌ๊ฑฐ๋‚˜ action์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Action
    job์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ step๋“ค์˜ ์กฐํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋…๋ฆฝ์ ์ธ ๋ช…๋ น์œผ๋กœ workflow์˜ ๊ฐ€์žฅ ์ž‘์€ ๋นŒ๋“œ ๋‹จ์œ„์ด๋‹ค. workflow์—์„œ action์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” action์ด step์„ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค. ์ง์ ‘ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๋งˆ์ผ“์— ๋“ฑ๋ก๋œ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์„ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  • Runner
    ํŠธ๋ฆฌ๊ฑฐ๋  ๋•Œ workflow๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์„œ๋ฒ„๋กœ, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Workflow ์ƒ์„ฑ ์˜ˆ์‹œ

  1. repository์—์„œ workflow ํŒŒ์ผ์„ ์ €์žฅํ•  .github/workflows/ ํด๋”๋ฅผ ๋งŒ๋“ ๋‹ค.

  2. .github/workflows/ ํด๋”์—์„œ learn-github-actions.yml๋ผ๋Š” ์ƒˆ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
    name: learn-github-actions
    run-name: ${{ github.actor }} is learning GitHub Actions
    on: [push]
    jobs:
      check-bats-version:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v3
          - uses: actions/setup-node@v3
            with:
              node-version: '14'
          - run: npm install -g bats
          - run: bats -v

  3. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ commitํ•˜๊ณ  Github repository์— pushํ•œ๋‹ค.

    ์ด์ œ ์ƒˆ Github Actions workflow ํŒŒ์ผ์ด repository์— ์„ค์น˜๋˜๊ณ  ๋ˆ„๊ตฐ๊ฐ€ repository์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ pushํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

Workflow ํŒŒ์ผ ์ดํ•ด

name: learn-github-actions

(์„ ํƒ ์‚ฌํ•ญ) Github repository์˜ "Action" ํƒญ์— ํ‘œ์‹œ๋˜๋Š” workflow์˜ ์ด๋ฆ„์ด๋‹ค.

run-name: ${{ github.actor }} is learning GitHub Actions

(์„ ํƒ ์‚ฌํ•ญ) workflow์—์„œ ์ƒ์„ฑ๋œ workflow์˜ ์‹คํ–‰ ์ด๋ฆ„์œผ๋กœ, ์ €์žฅ์†Œ์˜ "Action" ํƒญ์— ์žˆ๋Š” workflow ์‹คํ–‰ ๋ชฉ๋ก์— ํ‘œ์‹œ๋œ๋‹ค.

on: [push]

workflow ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” push ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ˆ„๊ตฐ๊ฐ€ ์ €์žฅ์†Œ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ pushํ•˜๊ฑฐ๋‚˜ pull ์š”์ฒญ์„ ํ•  ๋•Œ๋งˆ๋‹ค workflow ์‹คํ–‰์ด ํŠธ๋ฆฌ๊ฑฐ๋œ๋‹ค.

jobs:

learn-github-actions workflow์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  job์„ ํ•จ๊ป˜ ๊ทธ๋ฃนํ™”ํ•œ๋‹ค.

job์— ๋Œ€ํ•œ ์„ค์ •

  • runs-on: ํ•ด๋‹น job์„ ์–ด๋–ค OS์—์„œ ์‹คํ–‰ํ•  ๊ฒƒ์ธ์ง€ ๋ช…์‹œํ•œ๋‹ค.
  • steps: job์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์„ ๋‚˜์—ดํ•œ๋‹ค. ๊ฐ๊ฐ์˜ step์€ ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€์ง„๋‹ค.
  • uses: ํ•ด๋‹น step์—์„œ ์‚ฌ์šฉํ•  action์œผ๋กœ, Github ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์— ์˜ฌ๋ผ์˜จ action๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ {owner}/{repo}@{ref|version}์˜ ํ˜•ํƒœ๋ฅผ ์ง€๋‹Œ๋‹ค.
  • name: step์˜ ์ด๋ฆ„์ด๋‹ค.
  • run: job์— ํ• ๋‹น๋œ ์ปดํ“จํŒ… ์ž์›์˜ shell์„ ์ด์šฉํ•˜์—ฌ ์ปค๋งจ๋“œ ๋ผ์ธ์„ ์‹คํ–‰ํ•œ๋‹ค. node.js ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, ์ด ๊ณผ์ •์— npm package์˜ scripts๋ฅผ ๊ตฌ๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • env: ํ•ด๋‹น job์—์„œ ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ key/value์˜ ํ˜•ํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.
  • strategy: ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์—์„œ์˜ ํ…Œ์ŠคํŠธ/๋ฐฐํฌ๋ฅผ ์œ„ํ•ด์„œ ๋นŒ๋“œ matrix๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค. ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ node ๋ฒ„์ „์—์„œ ๊ฐ™์€ job์„ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • with: ํ•ด๋‹น action์— ์˜ํ•ด ์ •์˜๋˜๋Š” input ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ, key/value ํŽ˜์–ด๋กœ ๋˜์–ด ์žˆ๋‹ค. input ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •๋˜๊ณ , 'INPUT_'์ด๋ผ๋Š” prefix๊ฐ€ ๋ถ™๋Š”๋‹ค.

๐Ÿ“ Pytest

๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Test)๋ถ€ํ„ฐ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ(Acceptance Test)๊นŒ์ง€ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋Š” all-in-one Python Test Framework์ด๋‹ค.

๊ธฐ๋Šฅ

  • parametrization์„ ํ†ตํ•œ ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๊ด€๋ฆฌ
  • exception์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ
  • fixture๋ฅผ ์‚ฌ์šฉํ•œ object ์ œ๊ณต์œผ๋กœ dependency ํ•ด๊ฒฐ ๋ฐ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ์ž‘์„ฑ
  • mark๋ฅผ ํ†ตํ•œ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ๊ด€๋ฆฌ

์„ค์น˜ ๋ฐฉ๋ฒ•

๋ช…๋ น ํ”„๋กฌํ”„ํŠธ(cmd)์—์„œ pytest ์„ค์น˜
pip install -U pytest

๋ฒ„์ „ ํ™•์ธ
pytest --version

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

ํ•จ์ˆ˜์™€ ํ…Œ์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐ„๋‹จํ•œ test_sample.pyํŒŒ์ผ์„ ์ž‘์„ฑํ•œ๋‹ค. pytest๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋Š” ๊ผญ ์•ž์— test_ ๋กœ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋’ค์— _test ๋กœ ๋๋‚˜์•ผ ํ•œ๋‹ค.

# content of test_sample.py
def func(x):
    return x + 1

def test_answer():
    assert func(3) == 5

๊ทธ๋Ÿฐ ๋‹ค์Œ pytest test_sample.py ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์ฐฝ์ด ๋œฌ๋‹ค.

$ pytest test_sample.py
================================ test session starts =================================
platform win32 -- Python 3.10.3, pytest-7.2.2, pluggy-1.0.0
rootdir: C:\Users\lsymi\OneDrive\๋ฐ”ํƒ• ํ™”๋ฉด
collected 1 item

test_sample.py F                                                                [100%]

====================================== FAILURES ======================================
____________________________________ test_answer _____________________________________

    def test_answer():
>       assert func(3) == 5
E       assert 4 == 5
E        +  where 4 = func(3)

test_sample.py:7: AssertionError
============================== short test summary info ===============================
FAILED test_sample.py::test_answer - assert 4 == 5
================================= 1 failed in 0.05s ==================================

[100%]๋Š” ํ•ด๋‹น ์ฝ”๋“œ์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ–ˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ์™„๋ฃŒ๋œ ํ›„ ์ด ์ฝ”๋“œ์—์„  func(3)๊ฐ€ 5๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจ ๋ณด๊ณ ์„œ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.


ํ•จ์ˆ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ func(3) == 4๋กœ ๊ณ ์นœ ํ›„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐฝ์ด ๋œฌ๋‹ค.

$ pytest test_sample.py
================================ test session starts =================================
platform win32 -- Python 3.10.3, pytest-7.2.2, pluggy-1.0.0
rootdir: C:\Users\lsymi\OneDrive\๋ฐ”ํƒ• ํ™”๋ฉด
collected 1 item

test_sample.py .                                                                [100%]

================================= 1 passed in 0.01s ==================================

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด test_sample.py ๋ผ๋Š” ํ•จ์ˆ˜ ๋’ค์— โ€œ.โ€ ์  ํ•˜๋‚˜๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ, ์ด๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ํ…Œ์ŠคํŠธ ํ•˜๋‚˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๊ณ  ๊ทธ๊ฒŒ ํ†ต๊ณผ(โ€œ.โ€) ํ–ˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

parametrize

parametrize๋Š” ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ํ•œ๋ฒˆ์— ์ž‘์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์‚ฝ์ž… ์˜ˆ์ • -


import pytest

@pytest.mark.parametrize(
    "num,expected",
    [
        (1, 2),
        (2, 3),
        (10, 15),
    ],
)

def func(x):
    return x + 1

def test_answer(num, expected):
    assert expected == func(num)

๋‚ด ์ด๋ก ์ƒ ์ด ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋Œ์•„๊ฐˆ ์ค„ ์•Œ์•˜์œผ๋‚˜ ์—๋Ÿฌ ๋ฐœ์ƒ,,,

================================ test session starts =================================
platform win32 -- Python 3.10.3, pytest-7.2.2, pluggy-1.0.0
rootdir: C:\Users\lsymi\OneDrive\๋ฐ”ํƒ• ํ™”๋ฉด
collected 1 item

test_sample.py E                                                                [100%]

======================================= ERRORS =======================================
___________________________ ERROR at setup of test_answer ____________________________
file C:\Users\lsymi\OneDrive\๋ฐ”ํƒ• ํ™”๋ฉด\test_sample.py, line 16
  def test_answer(num, expected):
E       fixture 'num' not found
>       available fixtures: cache, capfd, capfdbinary, caplog, capsys, capsysbinary, doctest_namespace, monkeypatch, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory
>       use 'pytest --fixtures [testpath]' for help on them.

C:\Users\lsymi\OneDrive\๋ฐ”ํƒ• ํ™”๋ฉด\test_sample.py:16
============================== short test summary info ===============================
ERROR test_sample.py::test_answer
================================== 1 error in 0.02s ==================================

์กฐ๊ธˆ ๋” ์•Œ์•„๋ณธ ํ›„ ๋ฐ‘์˜ ์ฝ”๋“œ๊นŒ์ง€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•  ์˜ˆ์ •

exception

pytest.raises๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ํ•จ์ˆ˜์˜ exception์„ ์‹ค์ œ๋กœ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์‚ฝ์ž… ์˜ˆ์ • -

fixture

์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์“ฐ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์‚ฝ์ž… ์˜ˆ์ • -

mark

ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜์— ํ‘œ์‹œ๋ฅผ ๋‚จ๊ฒจ ํ…Œ์ŠคํŠธํ•  ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์‚ฝ์ž… ์˜ˆ์ • -


๐Ÿ“ Docker

Docker๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹ ์†ํ•˜๊ฒŒ ๊ตฌ์ถ•, ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ์†Œ์Šค ๊ฐ€์ƒํ™” ํ”Œ๋žซํผ์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ผ ํ•˜๋ฉด ๋ฐฐ์— ์‹ค๋Š” ๋„ค๋ชจ๋‚œ ํ™”๋ฌผ ์ˆ˜์†ก์šฉ ๋ฐ•์Šค๋ฅผ ๋– ์˜ฌ๋ฆด ๊ฒƒ์ด๋‹ค. ๊ฐ๊ฐ์˜ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—๋Š” ๋‹ค์–‘ํ•œ ํ™”๋ฌผ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ณ  ๊ทœ๊ฒฉํ™”๋˜์–ด ์ปจํ…Œ์ด๋„ˆ์„ ์ด๋‚˜ ํŠธ๋ ˆ์ผ๋Ÿฌ ๋“ฑ ๋‹ค์–‘ํ•œ ์šด์†ก์ˆ˜๋‹จ์œผ๋กœ ์‰ฝ๊ฒŒ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

์„œ๋ฒ„์—์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋„ ์ด์™€ ๋น„์Šทํ•œ๋ฐ, ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋žจ, ์‹คํ–‰ํ™˜๊ฒฝ์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ถ”์ƒํ™”ํ•˜๊ณ  ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ๋ฐฑ์—”๋“œ ํ”„๋กœ๊ทธ๋žจ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„, ๋ฉ”์‹œ์ง€ ํ ๋“ฑ ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ๋„ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ถ”์ƒํ™”ํ•  ์ˆ˜ ์žˆ๊ณ  ์กฐ๋ฆฝPC, AWS, Azure, Google cloud ๋“ฑ ์–ด๋””์—์„œ๋“  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Container

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

๊ธฐ์กด์˜ ๊ฐ€์ƒํ™” ๋ฐฉ์‹์€ ์ฃผ๋กœ OS๋ฅผ ๊ฐ€์ƒํ™”ํ•˜์˜€๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ์ต์ˆ™ํ•œ VMware๋‚˜ VirtualBox๊ฐ™์€ ๊ฐ€์ƒ๋จธ์‹ ์€ ํ˜ธ์ŠคํŠธ OS์œ„์— ๊ฒŒ์ŠคํŠธ OS ์ „์ฒด๋ฅผ ๊ฐ€์ƒํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด ๋ฐฉ์‹์€ ๋ฆฌ๋ˆ…์Šค์—์„œ ์œˆ๋„์šฐ๋ฅผ ๋Œ๋ฆฌ๋Š” ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ OS๋ฅผ ๊ฐ€์ƒํ™”ํ•  ์ˆ˜ ์žˆ๊ณ  ๋น„๊ต์  ์‚ฌ์šฉ๋ฒ•์ด ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋ฌด๊ฒ๊ณ  ๋Š๋ ค์„œ ์šด์˜ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด CPU์˜ ๊ฐ€์ƒํ™” ๊ธฐ์ˆ (HVM)์„ ์ด์šฉํ•œ KVMKernel-based Virtual Machine๊ณผ ๋ฐ˜๊ฐ€์ƒํ™” Paravirtualization๋ฐฉ์‹์˜ Xen์ด ๋“ฑ์žฅํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ๊ฒŒ์ŠคํŠธ OS๊ฐ€ ํ•„์š”ํ•˜๊ธด ํ•˜์ง€๋งŒ ์ „์ฒดOS๋ฅผ ๊ฐ€์ƒํ™”ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ์˜€๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ŠคํŠธํ˜• ๊ฐ€์ƒํ™” ๋ฐฉ์‹์— ๋น„ํ•ด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์—ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ๋“ค์€ OpenStack์ด๋‚˜ AWS, Rackspace๊ฐ™์€ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์—์„œ ๊ฐ€์ƒ ์ปดํ“จํŒ… ๊ธฐ์ˆ ์˜ ๊ธฐ๋ฐ˜์ด ๋˜์—ˆ๋‹ค.

์ „๊ฐ€์ƒํ™”๋“  ๋ฐ˜๊ฐ€์ƒํ™”๋“  ์ถ”๊ฐ€์ ์ธ OS๋ฅผ ์„ค์น˜ํ•˜์—ฌ ๊ฐ€์ƒํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฒฉ๋ฆฌ ํ•˜๋Š” ๋ฐฉ์‹์ด ๋“ฑ์žฅํ•œ๋‹ค.

๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ์ด ๋ฐฉ์‹์„ ๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ํ•˜๊ณ  ๋‹จ์ˆœํžˆ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฒฉ๋ฆฌ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. CPU๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋”ฑ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์„ฑ๋Šฅ์ ์œผ๋กœ๋„ ๊ฑฐ์˜ ์†์‹ค์ด ์—†๋‹ค.

  • ๋„์ปค์˜ ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ ๋ชจ๋“œ๋Š” Bridge๋ชจ๋“œ๋กœ ์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅ ์†์‹ค์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ --net=host ์˜ต์…˜์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

ํ•˜๋‚˜์˜ ์„œ๋ฒ„์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด ๋งˆ์น˜ ๊ฐ€๋ฒผ์šด VMVirtual Machine์„ ์‚ฌ์šฉํ•˜๋Š” ๋Š๋‚Œ์„ ์ค€๋‹ค. ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์— ์ ‘์†ํ•˜์—ฌ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๊ณ  apt-get์ด๋‚˜ yum์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž๋„ ์ถ”๊ฐ€ํ•˜๊ณ  ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋˜ํ•œ CPU๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๊ณ  ํ˜ธ์ŠคํŠธ์˜ ํŠน์ • ํฌํŠธ์™€ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ŠคํŠธ์˜ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋‚ด๋ถ€ ๋””๋ ‰ํ† ๋ฆฌ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Image

์ด๋ฏธ์ง€๋Š” ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰์— ํ•„์š”ํ•œ ํŒŒ์ผ๊ณผ ์„ค์ •๊ฐ’ ๋“ฑ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ƒํƒœ๊ฐ’์„ ๊ฐ€์ง€์ง€ ์•Š๊ณ  ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•œ ์ƒํƒœ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ณ  ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ๋ณ€ํ•˜๋Š” ๊ฐ’์€ ์ปจํ…Œ์ด๋„ˆ์— ์ €์žฅ๋œ๋‹ค. ๊ฐ™์€ ์ด๋ฏธ์ง€์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜๋”๋ผ๋„ ์ด๋ฏธ์ง€๋Š” ๋ณ€ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ๋‹ค.

  • Ubuntu image: ubuntu๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ํŒŒ์ผ์„ ๊ฐ€์ง.
  • MySQL image: debian์„ ๊ธฐ๋ฐ˜์œผ๋กœ MySQL์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํŒŒ์ผ๊ณผ ์‹คํ–‰ ๋ช…๋ น์–ด, ํฌํŠธ ์ •๋ณด ๋“ฑ์„ ๊ฐ€์ง.
  • Gitlab image: centos๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ruby, go, database, redis, gitlab source, nginx ๋“ฑ์„ ๊ฐ€์ง.

์ด๋ฏธ์ง€๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋”์ด์ƒ ์˜์กด์„ฑ ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฒƒ๋“ค์„ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ƒˆ๋กœ์šด ์„œ๋ฒ„๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์€ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋ฐ›๊ณ  ์ปจํ…Œ์ด๋„ˆ๋งŒ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

Layer

๋„์ปค ์ด๋ฏธ์ง€๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณดํ†ต ์šฉ๋Ÿ‰์ด ๋ช‡ ๋ฐฑ MB์— ์ด๋ฅธ๋‹ค. ์ฒ˜์Œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋ฐ›์„ ๋• ํฌ๊ฒŒ ๋ถ€๋‹ด์ด ์•ˆ๋˜์ง€๋งŒ ๊ธฐ์กด ์ด๋ฏธ์ง€์— ํŒŒ์ผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ–ˆ๋‹ค๊ณ  ๋ช‡ ๋ฐฑ MB๋ฅผ ๋‹ค์‹œ ๋‹ค์šด๋ฐ›๋Š”๋‹ค๋ฉด ๋งค์šฐ ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

๋„์ปค๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด layer๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๊ณ  ์œ ๋‹ˆ์˜จ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์ด์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ layer๋ฅผ ํ•˜๋‚˜์˜ ํŒŒ์ผ์‹œ์Šคํ…œ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ์ด๋ฏธ์ง€๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฝ๊ธฐ ์ „์šฉ layer๋กœ ๊ตฌ์„ฑ๋˜๊ณ  ํŒŒ์ผ์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ˆ˜์ •๋˜๋ฉด ์ƒˆ๋กœ์šด layer๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ubuntu ์ด๋ฏธ์ง€๊ฐ€ A+B+C์˜ ์ง‘ํ•ฉ์ด๋ผ๋ฉด, ubuntu ์ด๋ฏธ์ง€๋ฅผ ๋ฒ ์ด์Šค๋กœ ๋งŒ๋“  nginx ์ด๋ฏธ์ง€๋Š” A+B+C+nginx๊ฐ€ ๋œ๋‹ค. webapp ์ด๋ฏธ์ง€๋ฅผ nginx ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด A+B+C+nginx+source layer๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. webapp ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด A, B, C, nginx layer๋ฅผ ์ œ์™ธํ•œ ์ƒˆ๋กœ์šด source(v2) layer๋งŒ ๋‹ค์šด๋ฐ›์œผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ต‰์žฅํžˆ ํšจ์œจ์ ์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋„ layer ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๊ธฐ์กด์˜ ์ด๋ฏธ์ง€ layer ์œ„์— ์ฝ๊ธฐ/์“ฐ๊ธฐ layer๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด๋ฏธ์ง€ layer๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰์ค‘์— ์ƒ์„ฑํ•˜๋Š” ํŒŒ์ผ์ด๋‚˜ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์€ ์ฝ๊ธฐ/์“ฐ๊ธฐ layer์— ์ €์žฅ๋˜๋ฏ€๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•ด๋„ ์ตœ์†Œํ•œ์˜ ์šฉ๋Ÿ‰๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

์ด๋ฏธ์ง€ ๊ฒฝ๋กœ

์ด๋ฏธ์ง€๋Š” url ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ ํƒœ๊ทธ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค. ubuntu 14.04 ์ด๋ฏธ์ง€๋Š” docker.io/library/ubuntu:14.04 ๋˜๋Š” docker.io/library/ubuntu:trusty์ด๊ณ  docker.io/library๋Š” ์ƒ๋žต๊ฐ€๋Šฅํ•˜์—ฌ ubuntu:14.04๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํƒœ๊ทธ ๊ธฐ๋Šฅ์„ ์ž˜ ์ด์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ๋‚˜ ๋กค๋ฐฑ๋„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Dockerfile

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

Docker Hub

๋„์ปค ์ด๋ฏธ์ง€์˜ ์šฉ๋Ÿ‰์€ ๋ณดํ†ต ๋ช‡ ๋ฐฑ MB๋กœ GB๊ฐ€ ๋„˜๋Š” ๊ฒฝ์šฐ๋„ ํ”ํ•˜๋‹ค. ์ด๋ ‡๊ฒŒ ํฐ ์šฉ๋Ÿ‰์˜ ์ด๋ฏธ์ง€๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์€๋ฐ ๋„์ปค๋Š” Docker hub๋ฅผ ํ†ตํ•ด ๊ณต๊ฐœ ์ด๋ฏธ์ง€๋ฅผ ๋ฌด๋ฃŒ๋กœ ๊ด€๋ฆฌํ•ด์ค€๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด