์ž์‹ ์„ ๋ฏฟ๋Š” Tiny Docker ์ด๋ฏธ์ง€*

[๋ฏธ๊ตญ ์–ด๋ฆฐ์ด ๋™ํ™” "ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์€ ์—”์ง„" ์ฐธ์กฐ - ๋Œ€๋žต. ๋ ˆ์ธ]*

์ž์‹ ์„ ๋ฏฟ๋Š” Tiny Docker ์ด๋ฏธ์ง€*

ํ•„์š”์— ๋”ฐ๋ผ ์ž‘์€ Docker ์ด๋ฏธ์ง€๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

๋น„์ •์ƒ์ ์ธ ์ง‘์ฐฉ

์ง€๋‚œ ๋ช‡ ๋‹ฌ ๋™์•ˆ ์ €๋Š” Docker ์ด๋ฏธ์ง€๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž‘์•„๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ณ„์† ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ์ง‘์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๊ฐ€ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

์„ธ๋ถ€ ์‚ฌํ•ญ๊ณผ ๊ธฐ์ˆ ์„ ์„ค๋ช…ํ•˜๊ธฐ ์ „์— ์ด ๋ฌธ์ œ๊ฐ€ ์™œ ์ €๋ฅผ ๊ทธํ† ๋ก ๊ดด๋กญํ˜”๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฌธ์ œ๊ฐ€ ๊ท€ํ•˜์—๊ฒŒ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํฌ๊ธฐ๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ 

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

์ž‘์€ ์ด์ ์ด ํ•˜๋‚˜ ๋” ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๊ฐ€ ์กฐ๊ธˆ ๋” ๋นจ๋ฆฌ ๋‹ค์šด๋กœ๋“œ๋˜์ง€๋งŒ ์ œ ์ƒ๊ฐ์—๋Š” ์ด๊ฒƒ์ด ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ํฌ๊ธฐ๊ฐ€ ๊ฑฑ์ •๋œ๋‹ค๋ฉด ์•ŒํŒŒ์ธ ๋ฃฉ ์ž์ฒด๊ฐ€ ์ž‘์œผ๋ฏ€๋กœ ๊ท€ํ•˜์—๊ฒŒ ๋งž์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๋ฌด๋ถ„๋ณ„ํ•œ ์ด๋ฏธ์ง€

ํ”„๋กœ์ ํŠธ ๋””์ŠคํŠธ๋กœ๋ฆฌ์Šค ๊ธฐ๋ณธ "distroless" ์ด๋ฏธ์ง€ ์„ ํƒ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ช…๋ น์ค„์—์„œ ๋ณด๋˜ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž, ์…ธ ๋ฐ ๊ธฐํƒ€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. pip ะธ apt ์ž‘๋™ ์•ˆ ํ•  ๊ฒƒ์ด๋‹ค:

FROM gcr.io/distroless/python3
RUN  pip3 install numpy

Python 3 distroless ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Dockerfile

Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM gcr.io/distroless/python3
 ---> 556d570d5c53
Step 2/2 : RUN  pip3 install numpy
 ---> Running in dbfe5623f125
/bin/sh: 1: pip3: not found

์ด๋ฏธ์ง€์— ํ•์ด ์—†์Šต๋‹ˆ๋‹ค

์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๋ฌธ์ œ๋Š” ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

FROM python:3 as builder
RUN  pip3 install numpy

FROM gcr.io/distroless/python3
COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.5/

๋‹ค๋‹จ๊ณ„ ์กฐ๋ฆฝ

๊ฒฐ๊ณผ๋Š” 130MB ํฌ๊ธฐ์˜ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค. ๋‚˜์˜์ง€ ์•Š์•„! ๋น„๊ต๋ฅผ ์œ„ํ•ด ๊ธฐ๋ณธ Python ์ด๋ฏธ์ง€์˜ ๋ฌด๊ฒŒ๋Š” 929MB์ด๊ณ  "๋” ์–‡์€" ์ด๋ฏธ์ง€(3,7-slim) - 179MB, ์•ŒํŒŒ์ธ ์ด๋ฏธ์ง€(3,7-alpine)์€ 98,6MB์ด๊ณ , ์˜ˆ์ œ์— ์‚ฌ์šฉ๋œ ๊ธฐ๋ณธ distroless ์ด๋ฏธ์ง€๋Š” 50,9MB์ž…๋‹ˆ๋‹ค.

์ด์ „ ์˜ˆ์—์„œ๋Š” ์ „์ฒด ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•ฉ๋‹ˆ๋‹ค. /usr/local/lib/python3.7/site-packages, ์—ฌ๊ธฐ์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ข…์†์„ฑ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ๋ชจ๋“  Python ๊ธฐ๋ณธ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ ์ฐจ์ด๊ฐ€ ๋‹ค์–‘ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธ€์„ ์“ฐ๋Š” ์‹œ์ ์—์„œ Google distroless๋Š” ๋งŽ์€ ์ด๋ฏธ์ง€๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Java์™€ Python์€ ์•„์ง ์‹คํ—˜ ๋‹จ๊ณ„์— ์žˆ์œผ๋ฉฐ Python์€ 2,7๊ณผ 3,5์šฉ์œผ๋กœ๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์ž‘์€ ์ด๋ฏธ์ง€

์ž‘์€ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ง‘์ฐฉ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ €๋Š” distroless ์ด๋ฏธ์ง€๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”์ง€ ๋ณด๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. distroless ํ”„๋กœ์ ํŠธ๋Š” Google์˜ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. bazel. ๊ทธ๋Ÿฌ๋‚˜ Bazel์„ ์„ค์น˜ํ•˜๊ณ  ์ž์‹ ๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์†”์งํžˆ ๋งํ•ด์„œ ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์žฌ๋ฏธ ์žˆ๊ณ  ๊ต์œก์ ์ž…๋‹ˆ๋‹ค). ์ €๋Š” ์ž‘์€ ์ด๋ฏธ์ง€ ์ƒ์„ฑ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์€ ๋งค์šฐ ๋‹จ์ˆœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ‰๋ฒ”ํ•œ. ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์—†์œผ๋ฏ€๋กœ ์ฝ˜์†”์— ํ•œ ์ค„๋งŒ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ะฟั€ะพัั‚ะพ ัะพะฑั€ะฐั‚ัŒ ะพะฑั€ะฐะท ะดะปั <ะฟั€ะธะปะพะถะตะฝะธะต>.

๋”ฐ๋ผ์„œ ์ž์‹ ๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ๊ณ ์œ ํ•œ ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์„ ์•Œ์•„๋‘์„ธ์š”. scratch. ์Šคํฌ๋ž˜์น˜๋Š” "๋นˆ" ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌด๊ฒŒ๋Š” ์žˆ์ง€๋งŒ ํŒŒ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ์™€์šฐ! - 77๋ฐ”์ดํŠธ.

FROM scratch

์Šคํฌ๋ž˜์น˜ ์ด๋ฏธ์ง€

์Šคํฌ๋ž˜์น˜ ์ด๋ฏธ์ง€์˜ ์•„์ด๋””์–ด๋Š” ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ์ข…์†์„ฑ์„ ๋ณต์‚ฌํ•˜์—ฌ Dockerfile ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. apt ์ฒ˜์Œ๋ถ€ํ„ฐ ์„ค์น˜) ๋˜๋Š” ๋‚˜์ค‘์— Docker ์ด๋ฏธ์ง€๊ฐ€ ๊ตฌ์ฒดํ™”๋  ๋•Œ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Docker ์ปจํ…Œ์ด๋„ˆ์˜ ๋‚ด์šฉ์„ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋„ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์–ด๋–ป๊ฒŒ๋“  ์ด๋Ÿฌํ•œ ์ข…์†์„ฑ์„ ์ˆ˜์ง‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์กด ๋„๊ตฌ apt ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ ์‹œ์Šคํ…œ์— ๋ฌถ์—ฌ ์žˆ๊ณ  ๊ฒฐ๊ตญ Windows๋‚˜ MacOS๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์ž‘์€ ํฌ๊ธฐ์˜ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ์ž๋™์œผ๋กœ ๊ตฌ์ถ•ํ•˜๊ณ  ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ์ž์ฒด ๋„๊ตฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” Ubuntu/Debian ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒํ•˜๊ณ (๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ง์ ‘ ํŒจํ‚ค์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ) ์žฌ๊ท€์ ์œผ๋กœ ํ•ด๋‹น ์ข…์†์„ฑ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์€ ์ตœ์‹  ์•ˆ์ • ๋ฒ„์ „์˜ ํŒจํ‚ค์ง€๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ๋ณด์•ˆ ์œ„ํ—˜์„ ์ตœ๋Œ€ํ•œ ์ตœ์†Œํ™”ํ•˜๋„๋ก ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋„๊ตฌ ์ด๋ฆ„์„ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. fetchy, ์™œ๋ƒํ•˜๋ฉด ๊ทธ๋Š”... ํ•„์š”ํ•œ ๊ฒƒ์„... ์ฐพ์•„์„œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.์˜์–ด๋กœ๋ถ€ํ„ฐ "๊ฐ€์ ธ์˜ค๊ธฐ", "๊ฐ€์ ธ์˜ค๊ธฐ" - ์•ฝ. ๋ ˆ์ธ]. ์ด ๋„๊ตฌ๋Š” ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ž‘๋™ํ•˜์ง€๋งŒ ๋™์‹œ์— API๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์กฐํ•ฉํ•˜๋ ค๋ฉด fetchy (์ด๋ฒˆ์—๋Š” Python ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.) ๋‹ค์Œ๊ณผ ๊ฐ™์ด CLI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. fetchy dockerize python. ๋Œ€์ƒ ์šด์˜ ์ฒด์ œ์™€ ์ฝ”๋“œ๋ช…์„ ๋ฌป๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. fetchy ํ˜„์žฌ๋Š” Debian ๋ฐ Ubuntu ๊ธฐ๋ฐ˜ ํŒจํ‚ค์ง€๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ (์šฐ๋ฆฌ์˜ ๋งฅ๋ฝ์—์„œ) ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ข…์†์„ฑ์„ ์„ ํƒํ•˜๊ณ  ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Python์€ Perl์— ์˜์กดํ•˜์ง€๋งŒ Perl์„ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์กฐ์‚ฌ ๊ฒฐ๊ณผ

๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ Python ์ด๋ฏธ์ง€ fetchy dockerize python3.5 ๋ฌด๊ฒŒ๋Š” 35MB์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค(๋ฏธ๋ž˜์—๋Š” ๋” ๊ฐ€๋ฒผ์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค). ์šฐ๋ฆฌ๋Š” distroless ์ด๋ฏธ์ง€์—์„œ ์ถ”๊ฐ€๋กœ 15WW๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ์ˆ˜์ง‘๋œ ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์—ฌ๊ธฐ์—.

ํ”„๋กœ์ ํŠธ - ์—ฌ๊ธฐ์—.

๊ธฐ๋Šฅ์ด ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ ์š”์ฒญ์„ ์ž‘์„ฑํ•˜์„ธ์š”. ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค :) ๋”์šฑ์ด ์ €๋Š” ํ˜„์žฌ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ fetchy์— ํ†ตํ•ฉํ•˜์—ฌ ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

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