Airflow + dbt ํ”„๋กœ์ ํŠธ๋ฅผ Docker๋กœ ์„ธํŒ…ํ•˜๋˜ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์™€ ํ•ด๊ฒฐ๋ฒ•.

๐Ÿ” ๋ฌธ์ œ1 : ํ”Œ๋žซํผ ์•„ํ‚คํ…์ฒ˜ mismatch

์—๋Ÿฌ ๋ฉ”์‹œ์ง€:

The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8)
  • ๋‚ด Mac์€ ARM (Apple Silicon - M1/M2/M3)
  • dbt ๊ณต์‹ ๋„์ปค ์ด๋ฏธ์ง€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ amd64 (x86 ๊ธฐ๋ฐ˜)

๊ฒฐ๊ตญ ๋„์ปค๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ qemu ์—๋ฎฌ๋ ˆ์ด์…˜์„ ๋Œ๋ฆฌ๋‹ค๊ฐ€ Python ๊ฒฝ๋กœ ๊ผฌ์ž„๊นŒ์ง€ ๋ฐœ์ƒ โ†’ dbt dbt --version ์˜ค๋ฅ˜๋กœ ๋“œ๋Ÿฌ๋‚จ.
์ด๊ฑด ๋‹จ์ˆœ dbt ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋ผ ํ”Œ๋žซํผ mismatch๊ฐ€ ๊ทผ๋ณธ ์›์ธ์ž…๋‹ˆ๋‹ค.

์™œ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ?

  • dbt-labs๋Š” ARM-native ์ด๋ฏธ์ง€๋ฅผ ์•„์ง ๊ณต์‹์œผ๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š์Œ.
  • ๋Œ€๋ถ€๋ถ„์˜ ์‹ค์ „ ์šด์˜ํ™˜๊ฒฝ (AWS, GCP ๋“ฑ)์€ amd64 ๊ธฐ๋ฐ˜.
  • M1/M2 ๊ฐœ๋ฐœ์ž๋“ค์€ cross-platform์—์„œ ์ด๊ฑธ ์ž์ฃผ ๊ฒฝํ—˜.

ํ•ด๊ฒฐ๋ฒ•

1๏ธโƒฃ docker-compose.yml์— platform ๋ช…์‹œ

dbt:
  build:
    context: ./dbt
    dockerfile: Dockerfile.dbt
  platform: linux/amd64 <---- โœ… ์ด๋ถ€๋ถ„ ์ถ”๊ฐ€
    - ./dbt:/usr/app
  working_dir: /usr/app
  environment:
    - DBT_PROFILES_DIR=/usr/app/profiles
  depends_on:
    - postgres

๐Ÿ‘‰ platform: linux/amd64 ์ถ”๊ฐ€ โ†’ cross-arch๋ฅผ ๋ช…ํ™•ํžˆ ์„ ์–ธํ•˜๊ณ  build ์‹œ๋„

2๏ธโƒฃ docker buildx ํ™•์ธ

docker buildx ls

3๏ธโƒฃ ์บ์‹œ ๋‚ ๋ฆฌ๊ณ  ๋นŒ๋“œ ํด๋ฆฐํ•˜๊ฒŒ ์žฌ์‹œ์ž‘

docker-compose build --no-cache dbt
docker-compose up dbt

โŒโŒโŒ ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Œ!!

์ง„์งœ ๋ฃจํŠธ ์›์ธ ํ•˜๋‚˜ ๋”!

  • docker-compose๊ฐ€ ์‚ฌ์‹ค์ƒ Dockerfile.dbt๋ฅผ ๋นŒ๋“œํ•˜์ง€ ์•Š๊ณ , ghcr.io/dbt-labs/dbt-postgres:1.7.9 ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋Œ€๋กœ pullํ•˜๊ณ  ์žˆ์—ˆ์Œ.
  • ๊ทธ๋ž˜์„œ Dockerfile ๋‚ด๋ถ€ CMD๊ฐ€ ์ „ํ˜€ ๋ฐ˜์˜๋˜์ง€ ์•Š์•˜์Œ.
  • ์ด๊ฒŒ Error: No such command ‘dbt’ ๋ฌธ์ œ๋กœ ์ด์–ด์ง.

์—๋Ÿฌ ๋ฉ”์‹œ์ง€:

Error: No such command 'dbt'

์ตœ์ข… ํ•ด๊ฒฐ: ๋นŒ๋“œ ์ œ๊ฑฐ โ†’ image ์‚ฌ์šฉ์œผ๋กœ ์ „ํ™˜

dbt๋Š” ๋ณ„๋„ ๋นŒ๋“œ ํ•„์š” ์—†์Œ โ†’ ๊ณต์‹ image๋ฅผ ๋ฐ”๋กœ ์“ฐ๋Š” ๊ฒŒ ๊น”๋”ํ•˜๋‹ค.

dbt-labs์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ณต์‹ Docker ์ด๋ฏธ์ง€ โ€” ์˜ˆ๋ฅผ ๋“ค์–ด ghcr.io/dbt-labs/dbt-postgres:1.7.9 โ€” ์ด ์ด๋ฏธ์ง€ ์•ˆ์—๋Š” ์ด๋ฏธ ๋‹ค์Œ์ด ๋‹ค ๋“ค์–ด์žˆ๋‹ค:

  • dbt-core (dbt ๋ณธ์ฒด)
  • dbt-postgres adapter
  • python ์˜์กด์„ฑ
  • ์‹คํ–‰ ์ปค๋งจ๋“œ (CMD ์„ค์ •๊นŒ์ง€ ํฌํ•จ๋จ)

์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ Dockerfile์„ ๋งŒ๋“ค์–ด์„œ ๋˜ ๋ญ”๊ฐ€ ์ถ”๊ฐ€๋กœ ๋นŒ๋“œํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๐Ÿ›  ์–ธ์ œ ๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?

  • dbt์— ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ (์˜ˆ: dbt-bigquery, dbt-snowflake ๋“ฑ ๋‹ค๋ฅธ adapter)
  • ์ถ”๊ฐ€ Python ํŒจํ‚ค์ง€ ์„ค์น˜
  • ์ปค์Šคํ…€ ์Šคํฌ๋ฆฝํŠธ ํฌํ•จ

์ด๋Ÿด ๋•Œ๋Š” Dockerfile์„ ๋งŒ๋“ค์–ด์„œ ๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

โœ… ๊ทธ๋Ÿฐ๋ฐ ์ง€๊ธˆ ์ƒํ™ฉ์—์„œ๋Š”?

  • ์šฐ๋ฆฌ๋Š” dbt-postgres ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ์“ฐ๊ณ  ์žˆ์Œ.
  • ๋ณ„๋„ ์ถ”๊ฐ€ ํŒจํ‚ค์ง€๋„ ์—†์Œ.
  • ๊ทธ๋ƒฅ profiles ๋””๋ ‰ํ† ๋ฆฌ mountํ•ด์„œ config๋งŒ ๋„˜๊ฒจ์ฃผ๋ฉด ๋จ.

๐Ÿ‘‰ ์ด ๊ฒฝ์šฐ์—๋Š” ๊ณต์‹ image๋ฅผ pull ํ•ด์„œ ๊ทธ๋Œ€๋กœ ์“ฐ๋Š” ๊ฒŒ ๊ฐ€์žฅ ์•ˆ์ •์ ์ด๊ณ  ๊น”๋”ํ•จ. ๋นŒ๋“œ ์•ˆ ํ•ด๋„ ๋˜๊ณ , ๋นŒ๋“œ ๊ผฌ์ผ ์ผ๋„ ์—†์Œ.

dbt:
  image: ghcr.io/dbt-labs/dbt-postgres:1.7.9
  platform: linux/amd64
  volumes:
    - ./dbt:/usr/app
  working_dir: /usr/app
  environment:
    - DBT_PROFILES_DIR=/usr/app/profiles
  depends_on:
    - postgres

โœ… ํ•ต์‹ฌ ๋ณ€ํ™”:

  • build: ์ œ๊ฑฐ
  • image: ์„ ์–ธ
  • Dockerfile.dbt ์‚ญ์ œ ๊ฐ€๋Šฅ

๐Ÿ”ฅ ํ•œ ์ค„ ์š”์•ฝ

์ด ๋ฌธ์ œ๋Š” ARM Mac์—์„œ Docker ์“ฐ๋‹ค๋ณด๋ฉด ๋งˆ์ฃผ์น  ์ˆ˜ ์žˆ๋‹ค.

  • ํ”Œ๋žซํผ mismatch โ†’ platform ๋ช…์‹œ
  • Dockerfile ์•ˆ ์“ฐ๊ณ  ๊ณต์‹ ์ด๋ฏธ์ง€ ์‚ฌ์šฉ โ†’ ์ค‘๋ณต ๋ฌธ์ œ ์ œ๊ฑฐ
  • dbt ๊ณต์‹ ์ด๋ฏธ์ง€๋Š” ๋Œ€๋ถ€๋ถ„ “์ด๋ฏธ ๋‹ค ์„ธํŒ…๋œ ์™„์ œํ’ˆ"์ด๋‹ค.
  • ํ•„์š” ์—†๋Š” ๋นŒ๋“œ๋ฅผ ์‹œ๋„ํ•˜๋‹ค๊ฐ€ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค โ†’ ๊ทธ๋ƒฅ image๋งŒ pullํ•ด์„œ ์“ฐ๋Š” ๊ฒŒ ๋” ์‹ค์ „์ ์ธ ์šด์˜ ๋ฐฉ์‹์ด๋‹ค
  • airflow โ†’ ์ปค์Šคํ…€ ๋นŒ๋“œ ํ•„์š” โ†’ Dockerfile ์œ ์ง€