etc-Dockerfile-layer

๋„์ปค๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ๋•Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ณ„์ธต(layer)์„ ๊ฐ€์ง„ ๋‹ค์ˆ˜์˜ ์Šค๋ƒ…์ƒท์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ €์žฅํ•œ๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋“ค์„ ๊ด€๋ฆฌํ•  ๋•Œ ์ค‘๋ณต๋˜๋Š” ์˜์—ญ์„ ํ•˜๋‚˜์˜ ๋ ˆ์ด์–ด๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜์—ฌ ๊ณต๊ฐ„/์‹œ๊ฐ„์  ํšจ์œจ์„ ์–ป๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

์ฆ‰, ๋„์ปค๋Š” Dockerfile์„ ์ฝ์–ด๋“ค์—ฌ, ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋ณ€ํ™”๋ฅผ ์ฃผ๋Š” ์ปค๋งจ๋“œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด๋ฅผ ๋งŒ๋“ ๋‹ค. ์ด๊ฒƒ์œผ๋กœ ์ค‘๋ณต๋˜๋Š” ๋ ˆ์ด์–ด๋ฅผ ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ํ•„์š”๊ฐ€ ์—†์–ด์ ธ ์ด๋ฏธ์ง€์˜ ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•œ๋‹ค.

docker-image-layer

ํŠน์ • ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ inspect ๋กœ layer ํ™•์ธํ•˜๊ธฐ

docker image inspect node-local:1.0

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์œผ๋ฉฐ, RootFS๋ฅผ ํ™•์ธํ•˜์—ฌ ํ•ด๋‹น ์ด๋ฏธ์ง€๊ฐ€ 9๊ฐœ์˜ ๋ ˆ์ด์–ด๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

[
    {
        "Id": "sha256:d2b1b719a1f60fbe9cb436a112117d517423bab19764c55cc0e61258fd1d7f31",
        "RepoTags": [
            "node-local:0.1"
        ],
        ...
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:b09314aec293bcd9a8ee5e643539437b3846f9e5e55f79e282e5f67e3026de5e",
                "sha256:41becf86c7a23a890f2b72907619a62f1cec8523cfd6cd888b991d9c2459b5af",
                "sha256:4a376e76c5414adb4255663cd8d7c4f6c27df8036a6559a4e155889c0fddfdc1",
                "sha256:a636c9c56d21c54aadde0308b86a504b93598ce159c2800dc7bff428f037540e",
                "sha256:da23e30e92e9b53cdd2ab7b0a6e4891c2ad3f35c9ebb2c9289e4574afdabb225",
                "sha256:32605136cc29f06e42d37cd31ddd7bc8c7c8c9543fdf6045cbf765f7d0addd38",
                "sha256:6fc3c304e8f9abd83e399c8af09b9154e1a4a0b7a50fd34881c2fd9f29e7ad99",
                "sha256:7fd12f2647fc8c298469ca22bae9615e3094bc6859df9e4eb72b64b912804297",
                "sha256:7d603fc35fe21540db1112f38d891984fe6617bab14ab93f51549abe5e38ecb4"
            ]
        },
        "Metadata": {
            "LastTagTime": "2024-05-16T01:03:16.298319883Z"
        }
    }
]

Layer ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” syntax

  • RUN, COPY, ADD, WORKDIR, USER

  • ENV, LABEL, ARG, EXPOSE

RUN: ์ƒˆ๋กœ์šด ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์•ˆ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰

  • ๋”ฐ๋ผ์„œ &&๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ช…๋ น์–ด๋ฅผ ์ด์–ด์„œ ํ•˜๋‚˜์˜ ๋ ˆ์ด์–ด๊ฐ€ ์ƒ์„ฑ๋˜๋„๋ก ํ•œ๋‹ค.

  • ์˜ˆ์‹œ: RUN apt-get update && apt-get install -y python

COPY: ์ƒˆ๋กœ์šด ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

ADD: COPY์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ƒˆ๋กœ์šด ํŒŒ์ผ ๋˜๋Š— ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

USER: ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ UID์™€ GID๊ฐ€ ์ƒˆ๋กœ์šด ๋ ˆ์ด์–ด์— ๋ฐ˜์˜.

๋งŒ์•ฝ Dockerfile์˜ RUN, ADD, COPY, WORKDIR ๊ณผ ๊ฐ™์€ ๋ช…๋ น๋ฌธ์ด ์ˆ˜์ •๋˜๋ฉด, ๊ธฐ์กด ์บ์‹œ๊ฐ€ ๋ฌดํšจํ™” ๋˜๊ณ , ์ƒˆ๋กœ์šด ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

Cached layers ์™€ Dockerfile ๋ช…๋ น์–ด ์ˆœ์„œ

  • ์ด๋ฏธ์ง€ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด์ „ ๋นŒ๋“œ์˜ ๋ ˆ์ด์–ด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค.

  • ์ด๋ฏธ์ง€์˜ ๋ ˆ์ด์–ด๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ๋นŒ๋”๋Š” ๋นŒ๋“œ ์บ์‹œ์—์„œ ๋ ˆ์ด์–ด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

  • ๋งˆ์ง€๋ง‰ ๋นŒ๋“œ ์ดํ›„ ๋ ˆ์ด์–ด๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ํ•ด๋‹น ๋ ˆ์ด์–ด์™€ ๊ทธ ๋’ค์— ์žˆ๋Š” ๋ชจ๋“  ๋ ˆ์ด์–ด๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•œ๋‹ค.

docker-image-layer

์œ„์˜ ์ด๋ฏธ์ง€์—์„œ ๋ณด๋“ฏ์ด Dockerfile์€ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ์— ๋ณต์‚ฌ(COPY . .) ํ•œ ๋‹ค์Œ, ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…์†์„ฑ์„ ๋‹ค์šด๋กœ๋“œ(RUN go mod download) ํ•œ๋‹ค.

  • ํ”„๋กœ์ ํŠธ์˜ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๋ฉด, COPY ๋ ˆ์ด์–ด์— ๋Œ€ํ•œ ์บ์‹œ๊ฐ€ ๋ฌดํšจํ™” ๋œ๋‹ค.

  • ๋˜ํ•œ, ๊ทธ ๋’ค์— ์˜ค๋Š” ๋ชจ๋“  ๋ ˆ์ด์–ด์— ๋Œ€ํ•œ ์บ์‹œ๋„ ๋ฌดํšจํ™”๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋„์ปคํŒŒ์ผ ์ง€์นจ์˜ ์ˆœ์„œ ๋•Œ๋ฌธ์— ๋นŒ๋”๋Š” ํŒจํ‚ค์ง€๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์—๋„ Go ๋ชจ๋“ˆ์„ ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•œ๋‹ค.

Dockerfile ์ง€์นจ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์— ๋ณต์‚ฌ๋˜๊ธฐ ์ „์— ์ข…์†์„ฑ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์„ค์น˜๊ฐ€ ์ด๋ฃจ์–ด์ง€๋„๋ก ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ์—๋„ ๋นŒ๋”๊ฐ€ ์บ์‹œ์—์„œ ์ข…์†์„ฑ ๋ ˆ์ด์–ด๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Go์˜ ๊ฒฝ์šฐ go.mod ์™€ go.sum์ด๋ผ๋Š” ๋‘ ๊ฐœ์˜ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๋Š” node์˜ package.json ๊ณผ package-lock.json ๊ณผ ๊ฐ™๋‹ค.

์ˆœ์„œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•œ๋‹ค.

  • COPY go.mod go.sum . ๋ฅผ ๋จผ์ € ๋ฐฐ์น˜ํ•˜๊ณ  RUN์„ ํ†ตํ•ด ์ข…์†์„ฑ์„ ์„ค์น˜ํ•œ๋‹ค.

  • ๊ทธ ํ›„์— COPY . . ๋ช…๋ น์–ด๋กœ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค.

FROM golang:1.21-alpine

WORKDIR /src

COPY go.mod go.sum .

RUN go mod download

COPY . .

RUN go build -o /bin/client ./cmd/client
RUN go build -o /bin/server ./cmd/server

ENTRYPOINT [ "/bin/server" ]

์ด์ œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํŽธ์ง‘ํ•˜๋ฉด ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ๋นŒ๋”๊ฐ€ ๋งค๋ฒˆ ์ข…์†์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š๋Š”๋‹ค.

docker-image-layer

์ฐธ๊ณ  ๋ฌธ์„œ

Last updated