Docker์˜ ์‚ฌ์šฉ์ž

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

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

๋งฌ์›จ์–ด๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋น ์ ธ๋‚˜์™€ ํ˜ธ์ŠคํŠธ ์ปดํ“จํ„ฐ์— ์นจ์ž…ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋ฒ„๊ทธ๋Š” ํ•ญ์ƒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ •ํ•˜๋ฉด ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด ์—†๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ƒ์„ฑ

์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ Linux ๋ฐฐํฌํŒ์—์„œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ช…๋ น์€ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Debian ๊ธฐ๋ฐ˜ ๋ฐฐํฌ์˜ ๊ฒฝ์šฐ Dockerfile์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

RUN groupadd --gid 2000 node 
  && useradd --uid 2000 --gid node --shell /bin/bash --create-home node

์•ŒํŒŒ์ธ์˜ ๊ฒฝ์šฐ:

RUN addgroup -g 2000 node 
    && adduser -u 2000 -G node -s /bin/sh -D node

์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰

UID 2000์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋กœ ๋ชจ๋“  ํ›„์† ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

USER 2000

๋ชจ๋“  ํ›„์† ํ”„๋กœ์„ธ์Šค๋ฅผ ๋…ธ๋“œ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

USER node

์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜.

๋ณผ๋ฅจ ์žฅ์ฐฉ

์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ๋ณผ๋ฅจ์„ ํƒ‘์žฌํ•  ๋•Œ ์‚ฌ์šฉ์ž์—๊ฒŒ ํŒŒ์ผ์„ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด ์‚ฌ์šฉ์ž์™€ ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ๊ถŒํ•œ์ด ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ์™ธ๋ถ€ ์‚ฌ์šฉ์ž์˜ UID(GID)๊ฐ€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ด๋ฆ„์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Linux ์ปดํ“จํ„ฐ์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ UID์™€ GID๊ฐ€ 1000์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‹๋ณ„์ž๋Š” ์ปดํ“จํ„ฐ์˜ ์ฒซ ๋ฒˆ์งธ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

์‹๋ณ„์ž๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ ์‰ฝ์Šต๋‹ˆ๋‹ค.

id

๊ท€ํ•˜๋Š” ๊ท€ํ•˜์˜ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ์ •๋ณด๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์˜ˆ์ œ์˜ 2000์„ ๊ท€ํ•˜์˜ ์‹๋ณ„์ž๋กœ ๋ฐ”๊พธ๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž์—๊ฒŒ UID ๋ฐ GID ํ• ๋‹น

์‚ฌ์šฉ์ž๊ฐ€ ์ด์ „์— ์ƒ์„ฑ๋˜์—ˆ์ง€๋งŒ ์‹๋ณ„์ž๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RUN usermod -u 1000 node 
  && groupmod -g 1000 node

Alpine ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์„€๋„์šฐ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

RUN apk add โ€”no-cache shadow

์ด๋ฏธ์ง€ ๋นŒ๋“œ ์‹œ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ์‚ฌ์šฉ์ž ID ์ „๋‹ฌ

๊ท€ํ•˜์˜ ID์™€ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ID๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ Dockerfile์— ์ด ID๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž ID๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ฆ‰์‹œ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €๋Š” Docker๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๋Š” ๊ณผ์ •์—์„œ ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ Docker ์‚ฌ์šฉ์ž๋Š” ์ด๋ฏธ์ง€ ์ˆ˜๋ช…์— ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๊ฐ€ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € Dockerfile์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์–ด์…ˆ๋ธ”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ Dockerfile์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ƒ์„ฑ์€ ์ด๋ฏธ์ง€๊ฐ€ ๋นŒ๋“œ๋  ๋•Œ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋–ป๊ฒŒ๋“  ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— UID(GID)๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ง€์‹œ๋ฌธ์€ Dockerfile์—์„œ ์™ธ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ENV ะธ ARG. ์ง€์‹œ์–ด์˜ ์ƒ์„ธํ•œ ๋น„๊ต ์—ฌ๊ธฐ์—.

๋„์ปค ํŒŒ์ผ

ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node 
  && groupmod -g $GID node

๋‹ค์Œ๊ณผ ๊ฐ™์ด docker-compose๋ฅผ ํ†ตํ•ด ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„์ปค ์ž‘์„ฑ

build:
  context: ./src/backend
  args:
    UID: 1000
    GID: 1000

PS Docker์˜ ๋ชจ๋“  ๋ณต์žก์„ฑ์„ ์ตํžˆ๋ ค๋ฉด ๋ฌธ์„œ๋‚˜ ๊ธฐ์‚ฌ๋ฅผ ์ฝ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฐ์Šต์„ ๋งŽ์ด ํ•ด์•ผ ํ•˜๊ณ , Docker์— ๋Œ€ํ•œ ๋Š๋‚Œ๋„ ์ตํ˜€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

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