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 ์ ์ง