๊ฐ๋ฐ์ ํ๋๋ฐ ์์ด ์ปจํ ์ด๋๋ ๋ ์ด์ ๋น ์ง ์ ์์ ๋งํผ ์ค์ํ ๊ฐ๋ ์ด ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Docker ๋ ์ปจํ ์ด๋ ๋งค๋์ง ํด ์ค ๊ฐ์ฅ ๋ํ์ ์ด๋ผ๊ณ ๋ณผ ์ ์์ฃ .
์ปจํ ์ด๋๋ฅผ ์คํํ๊ธฐ ์ํด์ ์ด๋ฏธ์ง๊ฐ ํ์ํ๊ณ ๋ณดํธ์ ์ผ๋ก Docker ๋ฅผ ํตํด ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ฒ ๋ฉ๋๋ค. Dockerfile ์ ์์ฑ ํ ํ Docker ์ปค๋งจ๋๋ฅผ ์ด์ฉํ๋ฉด ์ด๋ฏธ์ง๊ฐ ๋ง๋ค์ด์ง๊ณ ์์ฃผ ์ฝ๊ฒ ์ปจํ ์ด๋๋ฅผ ์คํํ ์ ์์ต๋๋ค.
์ด๋ฏธ์ง๋ฅผ ๋น๋ ํ๋ ๋ฐ ์์ด์ ๋ฌผ๋ก ๊ฒฝ๋ํ๋ ์ค์ํ์ง๋ง, ๊ทธ ๋ชป์ง ์๊ฒ ์ด๋ฏธ์ง ๋ณด์๋ ์ค์ํฉ๋๋ค.
--previliged ๊ถํ์ ๋ถ์ฌํ๋ ๊ฑธ ์ง์ํ๊ณ , Dockerfile ์ ์ง์ ์ ์ผ๋ก crendentials ๊ด๋ จํ ์ ๋ณด๋ฅผ ์ถ๊ฐ(COPY) ํ๋ ๊ฑธ ์ฃผ์ํด์ผ ํฉ๋๋ค.
trivy ๋ฅผ ์ด์ฉํ๋ฉด ์์ฝ๊ฒ ์ด๋ฏธ์ง์ ์ทจ์ฝ์ ๊ฒ์ฌ๋ฅผ ํ ์ ์์ต๋๋ค.
์ด๋ฒ ๊ธ์์๋ ์ Dockerfile ์ ํตํด ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ๋ crendentials ์ ๊ฐ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ(COPY) ํ๋ฉด ์๋๋์ง ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
๊ทธ๋ผ ๋ ์ธ ๋๋์ฝ๋~
OverlayFS
๋ค์ด๊ฐ๊ธฐ ์์ ๋จผ์ ์ปจํ ์ด๋์ ํต์ฌ ๊ตฌ์กฐ์ธ OverlayFS ์ ๋ํด์ ์์๋ณผ ํ์๊ฐ ์์ต๋๋ค.
ํฌ๊ฒ lower dir, upper dir, merged dir ๊ฐ ์กด์ฌํฉ๋๋ค.
lower dir ์ read-only ๋ก ๋ง์ดํธ๋๋ ๋ ์ด์ด๋ค์ด ์กด์ฌํ๊ณ , upper dir ์ read-write ๊ถํ์ด ์๋ ๋ ์ด์ด๋ก ํ์ผ์ ๋ํ ์์ฑ/์์ /์ญ์ ๋ ๋ชจ๋ upper dir ์์ ์ผ์ด๋๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ upper dir ์์์ ์์ ์ด ๋๋๋ฉด lower dir ๋ก ๋ณ๊ฒฝ๋๋ฉฐ, ์ด๋ฐ์์ผ๋ก ๋ ์ด์ด๊ฐ ํ๋ํ๋์ฉ ์์ด๊ฒ ๋ฉ๋๋ค.
์ด๋ ๊ฒ ๋ง๋ค์ด์ง ๋ ์ด์ด๋ ํ๋๋ก merged ๋์ด merged dir ์ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
docker run ์ ํตํด ์ปจํ ์ด๋๋ฅผ ์คํํ๋ฉด ๋ชจ๋ ๋ ์ด์ด๋ lower dir ์ด๊ณ , docker exec ๋ฅผ ํตํด ์ํ๋๋ ํ์ผ ์์ฑ/์์ /์ญ์ ๋ upper dir ์ ์งํ๋ฉ๋๋ค.
์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ OverlayFS ๋ผ๊ณ ํฉ๋๋ค.
Container ๋ด credentials
์์ OverlayFS ๋ฅผ ์ดํด๋ดค๋๋ฐ ์ด๋ ์ ๋ ๋์น๋ฅผ ์ฑ์ จ์ ๊ฒ๋๋ค. Dockerfile ๋ด credentials ํ์ผ์ ์ถ๊ฐ(COPY) ํ๋ ์์ ๋ ์ด๋ฏธ์ง ๋ด์์ ๋ ์ด์ด๋ก ์กด์ฌํ๊ฒ ๋๋๋ฐ, ๋ ์ด์ด๋ ๊ฒฐ๊ตญ ํด๋๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์ rm -rf ๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ ์ง์ฐ๋๋ผ๋ COPY ๋ ์ด์ด์๋ ์ฌ์ ํ credentials ํ์ผ์ด ์กด์ฌํ ๊ฒ์ด๊ณ , ๋ ์ด์ด ํ๋ํ๋๋ฅผ ์ง์ ์ดํด๋ณผ ์ ์์ต๋๋ค.
์ข ๋ ์์ธํ ์ดํด๋ณด์ฃ !
alpine ๊ธฐ๋ฐ์ ๊ฐ๋จํ Dockerfile ์ ๋๋ค.
FROM alpine
COPY credentials.txt /credentials.txt
...
#-- credentials.txt ์ ์๋ ๋ฐ์ดํฐ๊ฐ์ง๊ณ ์ด๋ ํ ์์
์ ์งํํ ํ,
...
RUN rm -rf /credentials.txt
ENTRYPOINT ["tail", "-f", "/dev/null"]
์ด๋ฏธ์ง ๋น๋ ํ ์คํํฉ๋๋ค.
$ docker build -t test .
$ docker run --rm -d --name test test
๋น๋ํ ์ด๋ฏธ์ง ๊ธฐ๋ฐ์ผ๋ก ์ปจํ ์ด๋๋ฅผ ์คํํ๊ณ , credentails.txt ๊ฐ ์ง์์ง ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ๋ง ๋ณด๋ฉด ์์ ํ๊ฒ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ํ์ง๋ง ์ ํ ๊ทธ๋ ์ง ์์ฃ .
์์์ credentials.txt ์ ์ด๋ ํ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๊ฐ ์๋์ง ๋ง์์ ์๋๋ ธ๋๋ฐ, ํ๋ฒ ์ด๋ค ๋ฐ์ดํฐ์๋์ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
์ฐ์ ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ๋ ์ด์ด๋ฅผ ํ๋ํ๋์ฉ ์ดํด๋ณด์ฃ .
$ docker save test -o layers.tar
์ดํ layers.tar ์ ์์ถ์ ํ์ด์ฃผ๋ฉด ์๋์ ๊ฐ์ด ๋ ์ด์ด๋ค์ ๋ณผ ์ ์์ต๋๋ค.
์ฐ์ ๊ฐ์ฅ ์ต์์์ ์๋ b96b*.json ์ manifest.json ์ ์ดํด๋ณด๋ฉด ์ด๋ฏธ์ง์ ๋ํ ์ ๋ณด๋ค์ ํ์ธํ ์ ์์ต๋๋ค.
empty_layer ๊ฐ false ์ด ๋ ์ด์ด๋ค์ ์ค์ ๋ก ์กด์ฌํ๋ ๋ ์ด์ด์ด๋ฉฐ lower dir ์ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
empty_layer: true ๋ ์ค์ ๋ก ์กด์ฌํ๋ ๋ ์ด์ด๊ฐ ์๋ค๋ ๊ฑธ ์๋ฏธํฉ๋๋ค.
๋๋ฒ์งธ ๋ ์ด์ด์์ credentials ๋ฅผ COPY ํ๊ฒ ๋๋๋ฐ, ๋๋ฒ์งธ ๋ ์ด์ด์ ์ด๋ฆ์ ์๋ ์ธ ๊ฒ์ ์ ์ ์์ต๋๋ค.
5a3762b16a0553fbd33c44434322b4e201f1e916cc6b134ce6aa5467717c59ab
ํด๋น ๋ ์ด์ด(ํด๋)๋ก ์ด๋ํ ํ layer.tar ์ ์์ถ์ ํ์ด์ฃผ๋ฉด credentials.txt ๊ฐ ๋์ค๋ ๊ฑธ ์ ์ ์๊ณ ,
์ค์ ๋ก ํด๋ฆญํด๋ฉด ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ด๋ ๋ฏ ์ด๋ฏธ์ง ๋น๋๋ ์ธ๋ป๋ณด๋ฉด ์์ ํด ๋ณด์ด์ง๋ง ๋ ์ด์ด์ ๊ทธ๋๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ์ง ๋น๋์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ์ํํ ํ์์ธ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก rm -rf ๋ฅผ ์คํํ ๋ ์ด์ด๋ฅผ ์ดํด๋ณด๋ฉด credentials.txt ์์ .wh ๊ฐ ๋ถ์ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ, ์ ํํ ๋ ์ด์ด์์ ์ญ์ ํ ํ์ผ์ ๋ํด์๋ ์์ .wh ๋ฅผ ๋ถ์ฌ์ค๋๋ค.
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ๊น์ง!