์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ Buildah๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ง€์นจ

์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์„ ๋ณ„๋„์˜ ๋„๊ตฌ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ์–ด๋–ค ์ด์ ์ด ์žˆ๋‚˜์š”? ํŠนํžˆ ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋Š” ์„œ๋กœ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฐํ•ฉ๋˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ Buildah๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ง€์นจ

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ปจํ…Œ์ด๋„ˆํ™”๋œ OCI ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด์— ๋งค๋ ฅ์„ ๋Š๋‚๋‹ˆ๋‹ค. Kubernetes ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ์‹œ์Šคํ…œ. ์ง€์†์ ์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” CI/CD๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Red Hat OpenShift/Kubernetes๋Š” ๋นŒ๋“œ ์ค‘ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์ธก๋ฉด์—์„œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ตœ๊ทผ๊นŒ์ง€ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ๋‹จ์ˆœํžˆ ์ปจํ…Œ์ด๋„ˆ์— Docker ์†Œ์ผ“์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ณ  docker build ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๋…„ ์ „์— ์šฐ๋ฆฌ๋Š” ๋ณด์—ฌ์คฌ์–ด์š”์ด๋Š” ๋งค์šฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‹ค์ œ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†๋Š” ๋ฃจํŠธ๋‚˜ sudo๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ๋“ค์€ ์ง€์†์ ์œผ๋กœ Buildah๋ฅผ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ์šฐ๋ฆฌ๋Š” ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ ์šฐ๋ฆฌ ์˜๊ฒฌ์œผ๋กœ๋Š” Buildah๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ์‹คํ–‰ํ•˜๊ณ  ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. quay.io/buildah. ์‹œ์ž‘ํ•˜์ž...

์กฐ์ •

์ด๋Ÿฌํ•œ ์ด๋ฏธ์ง€๋Š” Dockerfiles์—์„œ ๋นŒ๋“œ๋˜์—ˆ์œผ๋ฉฐ Buildah ์ €์žฅ์†Œ์˜ ํด๋”์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ์ด๋ฏธ์ง€.
์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค Dockerfile์˜ ์•ˆ์ •์ ์ธ ๋ฒ„์ „.

# stable/Dockerfile
#
# Build a Buildah container image from the latest
# stable version of Buildah on the Fedoras Updates System.
# https://bodhi.fedoraproject.org/updates/?search=buildah
# This image can be used to create a secured container
# that runs safely with privileges within the container.
#
FROM fedora:latest

# Don't include container-selinux and remove
# directories used by dnf that are just taking
# up space.
RUN yum -y install buildah fuse-overlayfs --exclude container-selinux; rm -rf /var/cache /var/log/dnf* /var/log/yum.*

# Adjust storage.conf to enable Fuse storage.
RUN sed -i -e 's|^#mount_program|mount_program|g' -e '/additionalimage.*/a "/var/lib/shared",' /etc/containers/storage.conf

ํ˜ธ์ŠคํŠธ Linux ์ปค๋„ ์ˆ˜์ค€์—์„œ ๊ตฌํ˜„๋œ OverlayFS ๋Œ€์‹  ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ“จ์ฆˆ ์˜ค๋ฒ„๋ ˆ์ด, ํ˜„์žฌ OverlayFS๋Š” Linux ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ SYS_ADMIN ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•œ ๊ฒฝ์šฐ์—๋งŒ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋ฃจํŠธ ๊ถŒํ•œ ์—†์ด Buildah ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ“จ์ฆˆ ์˜ค๋ฒ„๋ ˆ์ด๋Š” ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋ฉฐ VFS ์Šคํ† ๋ฆฌ์ง€ ๋“œ๋ผ์ด๋ฒ„๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. Fuse๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Buildah ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ /dev/fuse ์žฅ์น˜๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

podman run --device /dev/fuse quay.io/buildahctr ...
RUN mkdir -p /var/lib/shared/overlay-images /var/lib/shared/overlay-layers; touch /var/lib/shared/overlay-images/images.lock; touch /var/lib/shared/overlay-layers/layers.lock

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

# Set up environment variables to note that this is
# not starting with user namespace and default to
# isolate the filesystem with chroot.
ENV _BUILDAH_STARTED_IN_USERNS="" BUILDAH_ISOLATION=chroot

๋งˆ์ง€๋ง‰์œผ๋กœ BUILDAH_ISOLATION ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Buildah ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ chroot ๊ฒฉ๋ฆฌ๋กœ ์‹คํ–‰๋˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” ์ถ”๊ฐ€ ๋‹จ์—ด์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Buildah๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๊ตฌ๋ถ„๋œ ์ž์ฒด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด SYS_ADMIN ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ SELinux ๋ฐ SECCOMP ๊ทœ์น™์„ ์™„ํ™”ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ๋ณด์•ˆ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋นŒ๋“œํ•˜๋ ค๋Š” ์šฐ๋ฆฌ์˜ ์„ ํ˜ธ ์‚ฌํ•ญ์— ๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ Buildah ์‹คํ–‰

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

์†๋„ ๋Œ€ ์•ˆ์ „

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

์œ„์—์„œ ์„ค๋ช…ํ•œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋Š” /var/lib/containers์— ์ €์žฅ ๊ณต๊ฐ„์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ˜ํ…์ธ ๋ฅผ ์ด ํด๋”์— ๋งˆ์šดํŠธํ•ด์•ผ ํ•˜๋ฉฐ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์†๋„์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

์„ธ ๊ฐ€์ง€ ์˜ต์…˜์„ ๊ณ ๋ คํ•ด ๋ด…์‹œ๋‹ค.

1 ์˜ต์…˜์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ตœ๋Œ€ ๋ณด์•ˆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ์ปจํ…Œ์ด๋„ˆ/์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ž์ฒด ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ์ž์ฒด์˜ /build ํด๋”์— ์ปจํ…์ŠคํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

# mkdir /var/lib/containers1
# podman run -v ./build:/build:z -v /var/lib/containers1:/var/lib/containers:Z quay.io/buildah/stable
buildah  -t image1 bud /build
# podman run -v /var/lib/containers1:/var/lib/containers:Z quay.io/buildah/stable buildah  push  image1 registry.company.com/myuser
# rm -rf /var/lib/containers1

๋ณด์•ˆ. ์ด๋Ÿฌํ•œ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋Š” Buildah๋Š” ์ตœ๋Œ€ ๋ณด์•ˆ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค: ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฃจํŠธ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋ชจ๋“  SECOMP ๋ฐ SELinux ์ œํ•œ ์‚ฌํ•ญ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ปจํ…Œ์ด๋„ˆ๋Š” โ€”uidmap 0๊ณผ ๊ฐ™์€ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฒฉ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 100000:10000.

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

2 ์˜ต์…˜์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Docker ์ˆ˜์ค€ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ/์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ์ง์ ‘ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# podman run -v ./build:/build:z -v /var/lib/containers:/var/lib/containers --security-opt label:disabled quay.io/buildah/stable buildah  -t image2 bud /build
# podman run -v /var/lib/containers:/var/lib/containers --security-opt label:disabled  quay.io/buildah/stable buildah push image2 registry.company.com/myuser

๋ณด์•ˆ. ์ด๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ˜ธ์ŠคํŠธ์˜ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ  ์ž ์žฌ์ ์œผ๋กœ Podman ๋˜๋Š” CRI-O์— ์•…์„ฑ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฐ€์žฅ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ Buildah ์ปจํ…Œ์ด๋„ˆ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ˜ธ์ŠคํŠธ์˜ ์Šคํ† ๋ฆฌ์ง€์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก SELinux ๋ถ„๋ฆฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‚˜๋จธ์ง€ ๋ณด์•ˆ ๊ธฐ๋Šฅ์— ์˜ํ•ด ์ž ๊ฒจ ์žˆ๊ณ  ๋‹จ์ˆœํžˆ ํ˜ธ์ŠคํŠธ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— Docker ์†Œ์ผ“๋ณด๋‹ค ์—ฌ์ „ํžˆ ์ข‹์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ. ์บ์‹ฑ์ด ์™„์ „ํžˆ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” ์ตœ๋Œ€๊ฐ’์ž…๋‹ˆ๋‹ค. Podman ๋˜๋Š” CRI-O๊ฐ€ ์ด๋ฏธ ํ˜ธ์ŠคํŠธ์— ํ•„์š”ํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ Buildah ํ”„๋กœ์„ธ์Šค๋Š” ์ด๋ฅผ ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์ด ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํ›„์† ๋นŒ๋“œ๋„ ์บ์‹œ์—์„œ ํ•„์š”ํ•œ ๊ฒƒ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

3 ์˜ต์…˜์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์˜ ํ•ต์‹ฌ์€ ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์šฉ ๊ณตํ†ต ํด๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

# mkdir /var/lib/project3
# podman run --security-opt label_level=s0:C100, C200 -v ./build:/build:z 
-v /var/lib/project3:/var/lib/containers:Z quay.io/buildah/stable buildah  -t image3 bud /build
# podman run --security-opt label_level=s0:C100, C200 
-v /var/lib/project3:/var/lib/containers quay.io/buildah/stable buildah push image3  registry.company.com/myuser

์ด ์˜ˆ์—์„œ๋Š” ์‹คํ–‰ ์‚ฌ์ด์— ํ”„๋กœ์ ํŠธ ํด๋”(/var/lib/project3)๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ ๋‚ด์˜ ๋ชจ๋“  ํ›„์† ๋นŒ๋“œ๋Š” ์บ์‹ฑ์˜ ์ด์ ์„ ์–ป์Šต๋‹ˆ๋‹ค.

๋ณด์•ˆ. ์˜ต์…˜ 1๊ณผ 2 ์‚ฌ์ด์— ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œํŽธ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋Š” ํ˜ธ์ŠคํŠธ์˜ ์ฝ˜ํ…์ธ ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ Podman/CRI-O ์ด๋ฏธ์ง€ ์Šคํ† ๋ฆฌ์ง€์— ์ž˜๋ชป๋œ ๋‚ด์šฉ์„ ๋„ฃ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ๋””์ž์ธ์˜ ์ผ๋ถ€๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์˜ ์กฐ๋ฆฝ์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ. Podman/CRI-O๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ŠคํŠธ ์ˆ˜์ค€์—์„œ ๊ณต์œ  ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋ณด๋‹ค ์ƒํ™ฉ์ด ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Buildah๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋ฉด ํ•ด๋‹น ์ด๋ฏธ์ง€๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด์˜ ๋ชจ๋“  ํ›„์† ๋นŒ๋“œ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ €์žฅ์šฉ๋Ÿ‰

ะฃ ์ปจํ…Œ์ด๋„ˆ/์Šคํ† ๋ฆฌ์ง€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๊ตฌ์ถ•ํ•  ๋•Œ ์ปจํ…Œ์ด๋„ˆ ์—”์ง„์ด ์ฝ๊ธฐ ์ „์šฉ ์˜ค๋ฒ„๋ ˆ์ด ๋ชจ๋“œ์—์„œ ์™ธ๋ถ€ ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ์ €์žฅ์†Œ(์ถ”๊ฐ€ ์ €์žฅ์†Œ)์™€ ๊ฐ™์€ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Storage.conf ํŒŒ์ผ์— ํ•˜๋‚˜ ์ด์ƒ์˜ ์ฝ๊ธฐ ์ „์šฉ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์ปจํ…Œ์ด๋„ˆ ์—”์ง„์ด ํ•ด๋‹น ์Šคํ† ๋ฆฌ์ง€์—์„œ ์›ํ•˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฌํ•œ ์ €์žฅ์†Œ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์—”์ง„์€ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ์Šคํ† ๋ฆฌ์ง€์—๋งŒ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„๋กœ ์Šคํฌ๋กคํ•˜์—ฌ quay.io/buildah/stable ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” Dockerfile์„ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

# Adjust storage.conf to enable Fuse storage.
RUN sed -i -e 's|^#mount_program|mount_program|g' -e '/additionalimage.*/a "/var/lib/shared",' /etc/containers/storage.conf
RUN mkdir -p /var/lib/shared/overlay-images /var/lib/shared/overlay-layers; touch /var/lib/shared/overlay-images/images.lock; touch /var/lib/shared/overlay-layers/layers.lock

์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋‚ด์—์„œ /etc/containers/storage.conf๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์Šคํ† ๋ฆฌ์ง€ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ /var/lib/shared ํด๋”์— ์žˆ๋Š” "additionalimagestores"๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์ค„์—์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ/์Šคํ† ๋ฆฌ์ง€์˜ ๋‚จ์šฉ์ด ์—†๋„๋ก ๊ณต์œ  ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ๋ช‡ ๊ฐœ์˜ ์ž ๊ธˆ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ๋นˆ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํด๋”๋ณด๋‹ค ๋†’์€ ๋ ˆ๋ฒจ์— ์ปจํ…Œ์ด๋„ˆ/์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋งˆ์šดํŠธํ•˜๋ฉด Buildah๊ฐ€ ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์œ„์—์„œ ์„ค๋ช…ํ•œ ์˜ต์…˜ 2๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Buildah ์ปจํ…Œ์ด๋„ˆ๋Š” ํ˜ธ์ŠคํŠธ์˜ ์ปจํ…Œ์ด๋„ˆ/์ €์žฅ์†Œ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ์— ๋”ฐ๋ผ Podman/CRI-O ์ˆ˜์ค€์˜ ์ด๋ฏธ์ง€ ์บ์‹ฑ์œผ๋กœ ์ธํ•ด ์ตœ๋Œ€ ์„ฑ๋Šฅ์„ ๊ฐ€์ง€์ง€๋งŒ ์ตœ์†Œํ•œ์˜ ๋ณด์•ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์Šคํ† ๋ฆฌ์ง€์— ์ง์ ‘ ์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‘ ๊ฐ€์ง€ ์žฅ์ ์„ ๋ชจ๋‘ ํ™œ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

# mkdir /var/lib/containers4
# podman run -v ./build:/build:z -v /var/lib/containers/storage:/var/lib/shared:ro -v  /var/lib/containers4:/var/lib/containers:Z  quay.io/buildah/stable 
 buildah  -t image4 bud /build
# podman run -v /var/lib/containers/storage:/var/lib/shared:ro  
-v >/var/lib/containers4:/var/lib/containers:Z quay.io/buildah/stable buildah push image4  registry.company.com/myuser
# rm -rf /var/lib/continers4

ํ˜ธ์ŠคํŠธ์˜ /var/lib/containers/storage๋Š” ์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋“œ๋กœ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ /var/lib/shared์— ๋งˆ์šดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ž‘์—…ํ•˜๋Š” Buildah๋Š” ์ด์ „์— Podman/CRI-O๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œํ•œ ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(hello, ์†๋„) ์ž์ฒด ์Šคํ† ๋ฆฌ์ง€(hello, ๋ณด์•ˆ)์—๋งŒ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Š” ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ SELinux ๋ถ„๋ฆฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š๊ณ  ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”.

์ค‘์š”ํ•œ ๋‰˜์•™์Šค

์–ด๋– ํ•œ ๊ฒฝ์šฐ์—๋„ ๊ธฐ๋ณธ ์ €์žฅ์†Œ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Buildah ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ๋ชจ๋“  ์žฅ์ ์€ ์•„๋‹™๋‹ˆ๋‹ค

์ถ”๊ฐ€ ์Šคํ† ๋ฆฌ์ง€์˜ ๊ฐ€๋Šฅ์„ฑ์€ ์œ„์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๊ณต์œ  ๋„คํŠธ์›Œํฌ ์Šคํ† ๋ฆฌ์ง€์— ๋ฐฐ์น˜ํ•˜๊ณ  ๋ชจ๋“  Buildah ์ปจํ…Œ์ด๋„ˆ์— ์ด์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CI/CD ์‹œ์Šคํ…œ์ด ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ์ •๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ํ•˜๋‚˜์˜ ์Šคํ† ๋ฆฌ์ง€ ํ˜ธ์ŠคํŠธ์— ์ง‘์ค‘์‹œํ‚จ ๋‹ค์Œ ์„ ํ˜ธํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์Šคํ† ๋ฆฌ์ง€ ๋„๊ตฌ(NFS, Gluster, Ceph, ISCSI, S3...)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  Buildah ๋˜๋Š” Kubernetes ๋…ธ๋“œ์— ์ด ์Šคํ† ๋ฆฌ์ง€์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

๊ฒฐ๋ก 

Kubernetes/CRI-O, Podman ๋˜๋Š” Docker์˜ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ Buildah๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ docker.socket์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ณ  ๊ฐ„๋‹จํ•˜๋ฉฐ ํ›จ์”ฌ ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ์ž‘์—…์˜ ์œ ์—ฐ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ณด์•ˆ๊ณผ ์„ฑ๋Šฅ ๊ฐ„์˜ ๊ท ํ˜•์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์Šคํ† ๋ฆฌ์ง€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ์ง€๋ฅผ ๋…ธ๋“œ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์†๋„๋ฅผ ๋†’์ด๊ฑฐ๋‚˜ ์™„์ „ํžˆ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

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