Moby: ์ œ์™ธ๋œ ํŒŒ์ผ๋กœ ๋ณต์‚ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2015๋…„ 08์›” 22์ผ  ยท  82์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: moby/moby

์ปจํ…์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ์˜ _part_๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ๋ณต์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ๋‹ค๋ฅธ COPY์˜ ๋Œ€์ƒ์ด ๋จ). ๋ถˆํ–‰ํžˆ๋„ ์ด์— ๋Œ€ํ•œ ํ˜„์žฌ ๊ฐ€๋Šฅ์„ฑ์€ ์ฐจ์„ ์ฑ…์ž…๋‹ˆ๋‹ค.

  1. ๋ณต์‚ฌํ•˜๊ณ  ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฌด์ œํ•œ COPY ํ›„์— ์›ํ•˜์ง€ ์•Š๋Š” ์ž๋ฃŒ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์›ํ•˜์ง€ ์•Š๋Š” ์ž๋ฃŒ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์บ์‹œ๊ฐ€ ๋ฌดํšจํ™”๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ์ž์‹ ์˜ COPY ๋ช…๋ น์— ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ COPYํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด๋ฏธ์ง€์— ๋ถˆํ•„์š”ํ•œ ๋ ˆ์ด์–ด๊ฐ€ _lot_ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  3. Dockerfile์ด ์›ํ•˜๋Š” ์ž๋ฃŒ๋ฅผ ํŽธ์•ˆํ•˜๊ฒŒ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ์ปจํ…์ŠคํŠธ๋ฅผ ์ค€๋น„ํ•˜๋Š” "docker build" ํ˜ธ์ถœ ์ฃผ์œ„์— ๋ž˜ํผ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฒˆ๊ฑฐ๋กญ๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
arebuilder kinenhancement kinfeature

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด +1, ๋งŽ์€ glob ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ง€์›๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ node_modules ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๋ณต์‚ฌํ•˜๋Š” ์ œ์•ˆ์ž…๋‹ˆ๋‹ค.

COPY . /app -node_modules/

๋ชจ๋“  82 ๋Œ“๊ธ€

https://docs.docker.com/reference/builder/#dockerignore -file ์ฐธ์กฐ
ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ .dockerignore ํŒŒ์ผ์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.dockerignore๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์“ด ๊ฒƒ์ฒ˜๋Ÿผ "๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ๋‹ค๋ฅธ COPY์˜ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค".

๋‹ค๋ฅธ ์‚ฌ๋ณธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์กฐ๊ฑด๋ถ€๋กœ ๋ณต์‚ฌํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ปจํ…์ŠคํŠธ์—๋Š” ๋งŽ์€ ๋””๋ ‰ํ„ฐ๋ฆฌ A1...A10๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ B๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. A1...A10์—๋Š” ํ•˜๋‚˜์˜ ๋Œ€์ƒ์ด ์žˆ๊ณ  B์—๋Š” ๋‹ค๋ฅธ ๋Œ€์ƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

COPY A1 /some/where/A1/
COPY A2 /some/where/A2/
...
COPY A10 /some/where/A10/
COPY B some/where/else/B/

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์–ด์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๋ถ€๋ถ„์ด ์–ด์ƒ‰ํ•ฉ๋‹ˆ๊นŒ? ๋ชจ๋‘ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋‚˜์—ดํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

COPY A* /some/where/
COPY B /some/where/else/

์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

A1..A10, B๋ผ๋Š” ์ด๋ฆ„์€ ๊ฐ€์งœ์˜€์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ COPY A* ... ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์˜ _contents_๋ฅผ ํ•จ๊ป˜ ๋˜์ง‘๋‹ˆ๋‹ค.

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

(BTW, #6094(๋‹ค์Œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ)๊ฐ€ ์ด ๊ฒฝ์šฐ์— ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ ์˜ต์…˜๋„ ์•„๋‹™๋‹ˆ๋‹ค.)

@bronger if COPY ๊ฐ€ cp ์™€ ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•˜๋ฉด ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๊นŒ?

์ œ๊ฐ€ 100% ์ดํ•ดํ–ˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
@duglin ์ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@bronger @cpuguy83 ์ด ์˜ฌ๋ฐ”๋ฅธ ์งˆ๋ฌธ์„ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 'cp'๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” 'cp'์—์„œ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ œ์™ธ ์˜ต์…˜์„ ๋ณด์•˜์ง€๋งŒ ์•Œ์•„์ฐจ๋ฆฌ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— '๋„์ปค ๋นŒ๋“œ' ๋ฐ–์—์„œ๋„ ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

cp ๋™์ž‘์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒํ™ฉ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

COPY ["A1", ... "A10", "/some/where/"]

"A11" ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ทธ ์ค„์„ ์ƒ๊ฐํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๊ฐ€๋ฒผ์šด ์œ ์ง€ ๊ด€๋ฆฌ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋ฐ›์•„ ๋“ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ cp๋Š” ์ œ์™ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„ ๋ณต์‚ฌํ•˜๊ณ  ์›ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ๋ณต์‚ฌ ์ž์ฒด ์™ธ์—๋Š” ์„ฑ๋Šฅ์— ๊ฑฐ์˜ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. docker์˜ COPY๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด B๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์บ์‹œ๊ฐ€ ์ž˜๋ชป ๋ฌดํšจํ™”๋˜๊ณ  ์ด๋ฏธ์ง€๊ฐ€ ๋” ์ปค์ง‘๋‹ˆ๋‹ค.

@bronger ๋‹น์‹ ์ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ:

COPY a b c d /some/where

๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๊ฒƒ์ฒ˜๋Ÿผ.

$ COPY ... RUN rm ... ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€ ๋ ˆ์ด์–ด๊ฐ€ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์บ์‹œ ๋ˆ„๋ฝ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ

COPY a b c d /some/where/

/some/where/{a,b,c,d} ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋Œ€์‹  abcd ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋‚ด์šฉ์„ ํ•จ๊ป˜ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. src ๋””๋ ‰ํ† ๋ฆฌ์— ์Šฌ๋ž˜์‹œ๊ฐ€ ์ถ”๊ฐ€๋œ rsync์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ _four_ ์ง€์นจ

COPY a /some/where/a/
COPY b /some/where/b/
COPY c /some/where/c/
COPY d /some/where/d/

ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์บ์‹œ๋„ ... ๋ผ๊ณ  ํ•˜๋ฉด

COPY . /some/where/
RUN rm -Rf /some/where/e

e๊ฐ€ ์ž‘์—…์— ํšจ๊ณผ์ ์œผ๋กœ ํฌํ•จ๋˜์ง€๋Š” ์•Š์ง€๋งŒ e๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์บ์‹œ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@bronger ๋„ค, ์Šฌํ”„๊ฒŒ๋„ ๋‹น์‹ ์ด ๋งž์Šต๋‹ˆ๋‹ค. --exclude zzz ํ”Œ๋ž˜๊ทธ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ https://github.com/docker/docker/blob/master/ROADMAP.md#22 -dockerfile-syntax์— ๋”ฐ๋ผ ๋งŽ์€ ๊ฒƒ์„ ์–ป์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๊ฒฌ์ธ.

๊ทธ๋Ÿด ์ˆ˜ ์žˆ์ง€. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹น๋ถ„๊ฐ„ COPY+rm์„ ์‚ฌ์šฉํ•˜๊ณ  FixMe ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๊ทธ๋ƒฅ :+1: ์ด ๋ฌธ์ œ. ๋‚˜๋Š” COPY๊ฐ€ rsync์˜ ํ›„ํ–‰ ์Šฌ๋ž˜์‹œ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ •๊ธฐ์ ์œผ๋กœ ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ผ ๋ช…๋ น๋ฌธ์—์„œ ์—ฌ๋Ÿฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋Š” ๊ณ„์ธต ํ™•์‚ฐ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ•˜๋‚˜๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋งŽ์€ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ์ ‘ํ•ฉ๋‹ˆ๋‹ค(๋‹ค๋ฅธ ๋ ˆ์ด์–ด ๋ฌดํšจํ™” ํšจ๊ณผ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์ค‘์— ๋ณต์‚ฌํ•  ์˜ˆ์ •). ๋”ฐ๋ผ์„œ --exclude ๋„ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ man rsync ๋ถ€ํ„ฐ:

       A trailing slash on the source changes this behavior to avoid  creating
       an  additional  directory level at the destination.  You can think of a
       trailing / on a source as meaning "copy the contents of this directory"
       as  opposed  to  "copy  the  directory  by name", but in both cases the
       attributes of the containing directory are transferred to the  containโ€
       ing  directory on the destination.  In other words, each of the followโ€
       ing commands copies the files in the same way, including their  setting
       of the attributes of /dest/foo:

              rsync -av /src/foo /dest
              rsync -av /src/foo/ /dest/foo

๋‚˜๋Š” ๋งŽ์€ ์•ผ์ƒ Dockerfile s๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์ฒด์ ์ธ ์˜ˆ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

/vendor
/part1
/part2
/part3
/...
/partN

๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

COPY /vendor /docker/vendor
RUN /vendor/build
COPY /part1 /part2 ... /partN /docker/ # copy directories part1-N to /docker/part{1..N}/
RUN /docker/build1-N.sh

๋”ฐ๋ผ์„œ part1-N์€ /vendor ๋นŒ๋“œ๋ฅผ ๋ฌดํšจํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (/vendor๋Š” part1-N์— ๋น„ํ•ด ๊ฑฐ์˜ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—).

์ด์ „์— part1-N์„ ์ž์ฒด ๋””๋ ‰ํ† ๋ฆฌ์— ๋„ฃ์–ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

/vendor
/src/part1-N

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋˜ํ•œ ๊ทธ๋ ‡๊ฒŒ ์‰ฝ๊ฒŒ ์žฌ๋ฐฐ์—ดํ•  ์ž์œ ๊ฐ€ ์—†๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค.

@praller์˜ ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋˜‘๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ๋ฌธ์ œ๋Š” Go์˜ filepath.Match๊ฐ€ ์ •๊ทœ ํ‘œํ˜„์‹์— ๋น„ํ•ด ๋งŽ์€ ์ฐฝ์˜์„ฑ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ฆ‰, ์•ˆํ‹ฐ ํŒจํ„ด ์—†์Œ).

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ๊ท ์—ด ๋ธŒ๋ ˆ์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด ๋ƒˆ์Šต๋‹ˆ๋‹ค. COPY๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ œ์™ธํ•  ์ˆ˜ ์—†์ง€๋งŒ ADD _can_ tgz๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์ถ”๊ฐ€ ๋นŒ๋“œ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.
tar --exclude='./deferred_copy' -czf all_but_deferred.tgz .
๋„์ปค ๋นŒ๋“œ ...

๊ทธ๋Ÿฐ ๋‹ค์Œ Dockerfile์—์„œ:
์ถ”๊ฐ€ ./all_but_deferred.tgz /application_dir/
.. ๊ฑฐ์˜ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ ˆ์ด์–ด์˜ ๋‚ด์šฉ ..
์ถ”๊ฐ€ํ•˜๋‹ค . /์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋””๋ ‰ํ† ๋ฆฌ/
.. ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๋ ˆ์ด์–ด์˜ ๋‚ด์šฉ

์ด๋Š” ํฌํ•จ/์ œ์™ธ๋ฅผ ์‹œ๋„ํ•˜๋Š” ๋‚ญ๋น„๋˜๋Š” ๋ ˆ์ด์–ด ์—†์ด ํฌํ•จ/์ œ์™ธ/๋ฌด์—‡์ด๋“  tar์˜ ์ „์ฒด ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

@jason-kane ์ด๊ฒƒ์€ ์ข‹์€ ํŠธ๋ฆญ์ž…๋‹ˆ๋‹ค. ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์ž‘์€ ์ : z (gzip) ํ”Œ๋ž˜๊ทธ๋ฅผ tar ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. sha256 ์ฒดํฌ์„ฌ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ Docker ์บ์‹œ๋ฅผ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด +1, ๋งŽ์€ glob ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ง€์›๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ node_modules ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๋ณต์‚ฌํ•˜๋Š” ์ œ์•ˆ์ž…๋‹ˆ๋‹ค.

COPY . /app -node_modules/

์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ๋Š”๋ฐ Java ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•ฝ 900MB์ด์ง€๋งŒ ๊ทธ ์ค‘ ๊ฑฐ์˜ 80%๊ฐ€ ๊ฑฐ์˜ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๋•Œ ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.
๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ดˆ๊ธฐ ์ƒํƒœ์ด๊ณ  ํด๋” ๊ตฌ์กฐ๊ฐ€ ๋‹ค์†Œ ์•ˆ์ •์ ์ด๋ฏ€๋กœ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก 6-7 COPY ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์ง€๋งŒ ์ ์  ๋” ๋งŽ์€ ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค

๐Ÿ‘

docker cp ์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ํด๋”๋ฅผ ์ œ์™ธํ•œ ํด๋”์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. git repo๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  .git ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@oaxlin ์ด๋ฅผ ์œ„ํ•ด .dockerignore ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@antoineco ์ •๋ง ํšจ๊ณผ ๊ฐ€ ์žˆ์„๊นŒ์š”? ์‹œ๋„ํ•œ ์ง€ ์˜ค๋ž˜๋˜์—ˆ์ง€๋งŒ ์ ์–ด๋„ ๋‹น์‹œ์—๋Š” .dockerignore ๊ฐ€ docker cp ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

@kkozmic-seek ์ ˆ๋Œ€์ ์œผ๋กœ ํ™•์‹คํ•ฉ๋‹ˆ๋‹ค :) ํ•˜์ง€๋งŒ ์–ธ๊ธ‰ํ•˜์‹  docker cp CLI ํ•˜์œ„ ๋ช…๋ น์€ Dockerfile์—์„œ ๋ฐœ๊ฒฌ๋œ COPY ๋ช…๋ น๋ฌธ๊ณผ ๋‹ค๋ฅด๋ฉฐ, ์ด๋Š” ์ด ๋ฌธ์ œ์˜ ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค.

docker cp ๋Š” ์‹ค์ œ๋กœ Dockerfile ๋ฐ . dockerignore ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ๋„ ์ •๋ง ์›ํ•ฉ๋‹ˆ๋‹ค - ๋นŒ๋“œ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ์˜ ์ด์ „ ๋ถ€๋ถ„์—์„œ ์ผ๋ถ€ ํด๋”๋ฅผ ๋ณต์‚ฌํ•œ ๋‹ค์Œ ์บ์‹œ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

์œ ์Šค ์ผ€์ด์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ COPY๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์ „์— ์ œ์™ธํ•  ํŒŒ์ผ์„ ๋งŒ์ง€์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

RUN touch /app/node_modules
COPY . /app
RUN rm /app/node_modules

AFAIK COPY ๋Š” ํŒŒ์ผ์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๊ฒƒ์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. COPY ๊ฐ€ ์‹ค์ œ๋กœ ํŒŒ์ผ์„ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์ด์ œ npm์ด ์„ค์น˜ํ•œ ๋‹ค์Œ COPY . /usr/src/app ํ•˜๋Š” https://nodejs.org/en/docs/guides/nodejs-docker-webapp/ ์— ์•ฝ๊ฐ„ ์˜์•„ํ•ดํ•ฉ๋‹ˆ๋‹ค. node_modules ๋„์ปค๊ฐ€ ๋ฌด์‹œ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๊นŒ? ๋ฐ˜๋ฉด์— COPY_NO_OVERWRITE (๋” ๋‚˜์€ ์ด๋ฆ„ ํ•„์š”) ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ณต์‚ฌํ•˜๋Š” ๋™์•ˆ ํŒŒ์ผ์„ ๋ฌด์‹œํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ฌด์‹œํ•˜๋ ค๋Š” ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ๋นˆ ํŒŒ์ผ/๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•จ).

FWIW, ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋งค์šฐ ์ถ”์•…ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ•ดํ‚น ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์˜ˆ์‹œ:
์•ฑ/
๊ตฌ์„ฑ/
์Šคํฌ๋ฆฝํŠธ/
ํˆฌ๊ธฐ/
๊ณต์ „/
...

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์›ํ•ฉ๋‹ˆ๋‹ค:

  1. ์ •์  ๋ณต์‚ฌ/
  2. ๋‹ค๋ฅธ ํŒŒ์ผ ๋ณต์‚ฌ
  3. ์•ฑ ๋ณต์‚ฌ/

ํ•ดํ‚น ์†”๋ฃจ์…˜:
ADD ./static /home/app
ADD ["./[^s^a]*", "./s[^t]*", "/home/app/"]
ADD ./app /home/app

๋‘ ๋ฒˆ์งธ ADD๋Š” "./st " ๋ฐ "./a"๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋‘ ๋ณต์‚ฌ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ์„ ์„ ์œ„ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋Œ“๊ธ€ ์ƒํƒœ๋Š”?

๐Ÿ‘

๐Ÿ‘

๐Ÿ‘

๐Ÿ‘

.gitignore์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ .dockerignore ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

@mirestrepo ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฒ˜์Œ ๋‘ ๊ฐ€์ง€ ํ›„์† ์กฐ์น˜๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

ํ˜„์žฌ ์ด๊ฒƒ์€ C#/dotnet ๊ฐœ๋ฐœ์— ๋Œ€ํ•œ ์—„์ฒญ๋‚œ ์„ฑ๋Šฅ ์ €ํ•˜์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ:

  • ๋จผ์ € ๋ชจ๋“  ์™ธ๋ถ€ dll์„ ๋„์ปค ์ด๋ฏธ์ง€์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค(My*.dll์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฒƒ).
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ My.*.dll๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  dll์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋‚ด๊ฐ€ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ๋ณต์‚ฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ (์‰ฝ๊ฒŒ) ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ dll์ด ์ด์ค‘์œผ๋กœ ๋ณต์‚ฌ๋˜์–ด ๋„์ปค ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ๊ฒƒ์ด ํ•˜๋‚˜์˜ ๋ ˆ์ด์–ด์— ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.
์™ธ๋ถ€ dll์ด ์บ์‹œ๋˜๋Š” ๋Œ€์‹  ๋งค๋ฒˆ ๋ณต์‚ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์ค‘์— ๋ฉ”๊ฐ€ ๋„ˆํ”„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

@adresdvila ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์—ˆ๋˜ solutoin์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค:

COPY ["[^M][^y]*","/app/"] 
COPY ./My* /app/

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹.json ํŒŒ์ผ์ด ์ฒซ ๋ฒˆ์งธ ๋ช…๋ น์—์„œ ๋ณต์‚ฌ๋œ๋‹ค๋Š” ๋ฌธ์ œ๋ฅผ ๋‚จ๊น๋‹ˆ๋‹ค.

@antoineco ๋•๋ถ„์— ์ œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ .git ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋„์ปค ์ด๋ฏธ์ง€์— ๋ณต์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ๊ทน์ ์œผ๋กœ ๊ฐœ์„ ํ•˜๊ณ  ๋‚ด ์ด๋ฏธ์ง€๋ฅผ ๋„์ปค ์บ์‹ฑ ์‹œ์Šคํ…œ์— ํ›จ์”ฌ ๋” ์นœ์ˆ™ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค. ๋‚˜๋จธ์ง€ ํŒŒ์ผ๋ณด๋‹ค ๋จผ์ € ๋ณต์‚ฌํ•˜๋ ค๋Š” ํฐ ํŒŒ์ผ์ด ์žˆ์œผ๋ฏ€๋กœ ๋ณต์‚ฌํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐ˜๋ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(7GB bin ํŒŒ์ผ). ์ƒˆ๋กœ์šด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

COPY ๋ฐ ํ”„๋ฃจ๋‹ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋ฌธ์ œ๋Š” ํ”„๋ฃจ๋‹ ์ „ ๋ ˆ์ด์–ด์— ์—ฌ์ „ํžˆ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

COPY . --exclude=a --exclude=b ๋Š” ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. @cpuguy83 ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?

@๋…ธ์›จ์ปค ์ข‹์•„์š”. ์–ด์จŒ๋“  tar ๋ฐ rsync ์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
dockerignore์™€ ๋™์ผํ•œ ํ˜•์‹์„ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@tonistiigi @dnephin

์ด ์‚ฌ๊ฑด์€ #32507์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@cpuguy83 ๋„ค. ํŠนํžˆ COPY --chown=uid:gid ์— ๋”ฐ๋ผ

@dnephin RUN --mount ๋Š” ์ถœ๋ ฅ์ด ์ƒ์„ฑ๋œ ํ›„ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘” ์™„์ „ํžˆ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. (์˜ˆ: Go๋กœ ์ปดํŒŒ์ผ, Markdown ํŒŒ์ผ์—์„œ HTML ์ƒ์„ฑ ๋“ฑ). RUN --mount ๋Š” ๋งˆ์•ฝ์ด๊ณ  ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ํ”„๋กœ์ ํŠธ(Sphinx๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API ๋ฌธ์„œ ์ƒ์„ฑ)์—์„œ ํ™•์‹คํžˆ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

COPY somedir --exclude=excludeddir1 --exclude=excludeddir2 ๋Š” ์ด๋ฏธ์ง€์—์„œ ๋๋‚˜์•ผ ํ•˜์ง€๋งŒ ํ•˜๋‚˜๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ COPY ๋ฌธ์— ํฉ์–ด์ ธ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ์— ๋งŽ์€ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ๊ณ  ๋ณ€๊ฒฝ/์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ช…์‹œ์ ์ธ COPY first second third .... eleventh destination/ ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ์†Œ์Šค ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์บ์‹œ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋จผ์ € ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ์„ ์ œ์™ธํ•œ ๋Œ€๋ถ€๋ถ„ ์˜ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปดํŒŒ์ผ/์ƒ์„ฑ - ๋ณต์‚ฌํ•œ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(์˜ˆ). ๋งจ ์ฒ˜์Œ์—๋Š” ์ด์ „ ๋นŒ๋“œ ์ดํ›„ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ปดํŒŒ์ผ/์ƒ์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ์ด์ „์— ์ œ์™ธ๋œ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ, ๋‚˜๋Š” ton ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋จผ์ € COPYํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ, ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์— ์–ด๋”˜๊ฐ€์— COPYํ•˜๊ณ  ์‹ถ์€ ์ปคํ”Œ.

์•„์ด๋””์–ด๋Š” RUN --mount ๊ฐ€ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. COPY --exclude ๋Š” ํ•˜๋‚˜์˜ ๋ฌธ์ œ๋งŒ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ณ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. RUN --mount... rsync --exclude ... (๋˜๋Š” ๊ฐœ๋ณ„ ํ•ญ๋ชฉ์„ ๋ณต์‚ฌํ•˜๋Š” ์ผ๋ถ€ ์Šคํฌ๋ฆฝํŠธ)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  COPY --exclude ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

@dnephin ์•„, RUN --mount rsync ์ƒ๊ฐ์„ ๋ชปํ–ˆ๋„ค์š”! ํ›Œ๋ฅญํ•œ! ๐Ÿ‘

์ •๋ง ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์บ์‹ฑ์„ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค @Nowaker . ์žฌ๋™๊ธฐํ™”ํ•˜๋ ค๋Š” ํ•ญ๋ชฉ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋งˆ์šดํŠธ๋œ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ์บ์‹œ๊ฐ€ ๋ฌดํšจํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น rsync์˜ ์ถœ๋ ฅ์„ ๋‹ค๋ฅธ ๊ฒƒ์— ๋Œ€ํ•œ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์บ์‹œ๊ฐ€ ๋‹ค์‹œ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ •๋ง๋กœ ๊ทธ๊ฒƒ์„ ์œ„ํ•ด ์ค€๋น„๋˜์–ด ์žˆ๋‹ค๋ฉด https://gist.github.com/tonistiigi/38ead7a4ed60565996d207a7d589d9c4#file -gistfile1-txt-L130-L140 ๊ณผ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ํ˜„์žฌ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. RUN --mount (๋˜๋Š” buildkit์˜ LLB)์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์‹ค์ œ๋กœ ๋‹จ๊ณ„ ๊ฐ„์— ํŒŒ์ผ์„ ๋ณต์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ํŒŒ์ผ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค.

https://docs.docker.com/develop/develop-images/multistage-build/๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

FROM php:7.2-apache as source
COPY ./src/ /var/www/html/
RUN rm -rf /var/www/html/vendor/
RUN rm -rf /var/www/html/tests/

FROM php:7.2-apache
COPY --from=source /var/www/html/ /var/www/html/

@antoineco Welp, ๋” ์ด์ƒ ์šฐ์ˆ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€์ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค..

@MartijnHols ์ด๊ฒƒ์€ ์ข‹์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ฒŒ์‹œํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์œ ์ง€ ๊ด€๋ฆฌ์ž์—๊ฒŒ: ์ฆ‰, "COPY์—์„œ --chown์„ ๊ตฌํ˜„ํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ์—์„œ RUN chown์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜จ์ „ํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด --exclude ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฆ˜ Dockerfiles์—๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค.

COPY --exclude ์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์— ์ „์ฒด๋ฅผ ๋ณต์‚ฌํ•ด์•ผ ํ•˜๋Š” ๋น… ๋ฐ์ดํ„ฐ ํด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋‚ด์šฉ์€ ์ž์ฃผ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์บ์‹œ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋””๋ ‰ํ† ๋ฆฌ์— ํ•˜๋‚˜์˜ ํฐ ํŒŒ์ผ์ด ์žˆ๋Š”๋ฐ ๋‚˜๋จธ์ง€๋Š” ๋ณต์‚ฌํ•˜๊ธฐ ์ „์— ์ž์ฒด ๋ ˆ์ด์–ด์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค.

requirements.txt๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ณ„์ธตํ™”๋œ ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ด๊ฑฐ ๊ฐ€์ง€๊ณ ์žˆ์–ด:

/root-app
 - /Dockerfile
 - /requirements.txt
 - /LICENSE
 - /helloworld.py
 - /app-1
     -/app-1/script1
     -/app-1/script2
     -/app-1/script3
 - /app-2
     -/app-2/script1

๊ทธ๋ฆฌ๊ณ  ๋„์ปคํŒŒ์ผ:

FROM python:slim
COPY ./requirements.txt /
RUN pip install --trusted-host pypi.python.org -r /requirements.txt
WORKDIR /root-app
COPY . /helloworld
CMD ["python", "helloworld.py"]

์š”๊ตฌ ์‚ฌํ•ญ ๋นŒ๋“œ ์บ์‹œ๋ฅผ ์ œ์™ธํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๋ฒˆ์งธ COPY ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ด๋ฉฐ ... ๋งŽ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ๋‚ด app-1 ๋ฐ app-2๋ฅผ ์œ ์‚ฌํ•˜๊ฒŒ ๊ณ„์ธตํ™”ํ•ฉ๋‹ˆ๊นŒ?

@axehayz ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ๋ฌป๋Š” ๊ฒƒ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ https://medium.com/@guillaumejacquart/node -js-docker-workflow-12febcc0eed8์˜ ๋…ธ๋“œ ์›Œํฌํ”Œ๋กœ์™€ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ๋‘ ๋ฒˆ์งธ ์‚ฌ๋ณธ์ด COPY . ์ด์–ด๋„ ๋ฉ๋‹ˆ๋‹ค. pip install ์ด์ „์— ์˜ค๋Š” ํ•œ ์„ค์น˜๋œ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ์บ์‹œ๋œ ๋‚ด์šฉ์„ ๋ฌดํšจํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

COPY --exclude=... --exclude=...์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด COPY --from=oldimage๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์•ผ ํ•˜์ง€๋งŒ ์ผ๋ถ€๋Š” ๋ณต์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋””๋ ‰ํ† ๋ฆฌ๋ณ„๋กœ ํ•  ์ˆ˜ ๋Š” ์žˆ์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค... ๊ทธ๋Ÿฌ๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ/ํŒŒ์ผ ๋ชฉ๋ก์„ --excludeํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ --exclude ์˜ต์…˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ํ›จ์”ฌ ๋” ์ข‹๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ 3๋…„ ๋ฐ˜์ด ์ง€๋‚˜๋„ ์ „ํ˜€ ์ธ์ •์ด ์—†๋Š” ๊ฑด๊ฐ€์š”?

@asimonf ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋งŽ์€ ์Šน์ธ๊ณผ ์•ž๋’ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ์ด ์ผ์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์ธ๊ฐ€์š”? ๋งž์•„์š”. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋Š” ์ผ์— ๋Œ€ํ•ด ์„ ํƒ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

# haven't tested exact syntax, but this is the general idea
FROM myRsync AS files
COPY . /foo
RUN mkdir /result && rsync -r --exclude=<pattern> /foo/ /result/

FROM scratch
COPY --from=files /result/* /

๋นŒ๋“œํ‚ท์„ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”๊ฐ€ ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

#syntax=docker/dockerfile:experimental
..
RUN --mount=target=/ctx rsync ... /ctx/ /src/

๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ ์—ฌ๊ธฐ์—์„œ ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์บ์‹œ๋Š” COPY ๋‹จ๊ณ„์—์„œ ์—ฌ์ „ํžˆ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ ์—ฌ๊ธฐ์—์„œ ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์บ์‹œ๋Š” COPY ๋‹จ๊ณ„์—์„œ ์—ฌ์ „ํžˆ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋งž์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ง€๊ธˆ ๊ฒช๊ณ  ์žˆ๋Š” ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค๋‹จ๊ณ„๋Š” ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

์บ์‹œ๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ๋ฅผ ๋‹ค๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

FROM alpine as source

WORKDIR /app
COPY . ./
RUN scripts/stagify-files

FROM node:12.4.0

WORKDIR /app

# Step 0: Setup environments
COPY --from=source /app/stage0 ./
RUN stage0-build.sh

# Step 1: Install npm packages
COPY --from=source /app/stage1 ./
RUN stage1-build.sh

# Step 2: Build project
COPY --from=source /app/stage2 ./
RUN stage2-build.sh

@zenozen ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ ๋ฌธ์ œ๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๋„์ปค ๋นŒ๋“œ๋ฅผ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ์ด์•„์›ƒ์„ ์ •๋ ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋„์ปค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํŒŒ์ผ์„ ๋ ˆ์ด์•„์›ƒํ•˜๋Š” ๋ฐฉ๋ฒ•(์˜ˆ: ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ์„ฑ, ์‹ ์ž… ์ง์›์„ ์œ„ํ•œ ์‚ฌ์šฉ ์šฉ์ด์„ฑ, ๊ต์ฐจ ํ”„๋กœ์ ํŠธ ํ‘œ์ค€, ํ”„๋ ˆ์ž„์›Œํฌ ์š”๊ตฌ ์‚ฌํ•ญ ๋“ฑ)์„ ๊ฒฐ์ •ํ•  ๋•Œ ๊ท ํ˜•์„ ๋งž์ถฐ์•ผ ํ•˜๋Š” ๋งŽ์€ ๊ณ ๋ ค ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

@cfletcher ๋ฌด์Šจ ๋ง์ธ์ง€ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์‹ค์ œ๋กœ Dockerfile์„ ํ•˜์œ„ ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค(์ด๋กœ ์ธํ•ด rsync๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํŒŒ์ผ์„ ๋‹จ๊ณ„ํ™”ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ). ์ฆ‰, Dockerfile์„ ์ˆจ๊ธฐ๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‚ด๊ฐ€ ์ƒ์ƒํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์— 100๊ฐœ์˜ ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ 1๊ฐœ๋ฅผ ์„ ํƒํ•˜์—ฌ stage0์„ ๋งŒ๋“  ๋‹ค์Œ ๊ทธ ์ค‘ 1+10์„ ์„ ํƒํ•˜์—ฌ stage 1์„ ๋งŒ๋“  ๋‹ค์Œ 100๊ฐœ๋ฅผ ๋ชจ๋‘ ์„ ํƒํ•˜์—ฌ stage 2๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฐ ๋‹จ๊ณ„๋Š” ์ด์ „ ๋‹จ๊ณ„ ์œ„์— ์Œ“์ด๊ณ  ๋‹ค๋ฅธ ๋นŒ๋“œ ๋ช…๋ น์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์˜ ๊ฒฝ์šฐ stagify-files ๋…ผ๋ฆฌ๊ฐ€ ๋ณต์žกํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ์ฝ”๋“œ๋ฅผ ๋ชจ๋“ˆ๋กœ ๋ถ„ํ• ํ•˜๊ณ  npm install ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋ชจ๋“  package.json ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ณต์‚ฌ์— ๋Œ€ํ•œ ์ผ์ข…์˜ ์ œ์™ธ ์ธ์ˆ˜๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— 20๊ฐœ ์ด์ƒ์˜ ํŒŒ์ผ๊ณผ 10๊ฐœ ์ด์ƒ์˜ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 2๊ฐœ์˜ ๋””๋ ‰ํ† ๋ฆฌ์™€ ๋ช‡ ๊ฐœ์˜ ํŒŒ์ผ์„ ๋งŽ์ด ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋‘ ๊ฐœ์˜ COPY ๋ ˆ์ด์–ด๋กœ ๋‚˜๋ˆ„๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์ ˆ๋Œ€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š” ์ •์  ํŒŒ์ผ ๋ฐ ๋””๋ ‰ํ† ๋ฆฌ์šฉ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ํ•ญ์ƒ ๋งŒ์ง€๋Š” ํŒŒ์ผ ๋ฐ ๋””๋ ‰ํ† ๋ฆฌ์šฉ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋ฌด์‹œ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋งค์šฐ ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค. ์บ์‹œ๋ฅผ ๋ฌดํšจํ™”ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋นŒ๋“œ๋‹น 5๋ถ„์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

COPY ์— ๊ฐ„๋‹จํ•œ --exclude ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ค์šด ์ผ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋งŽ์ด ํˆฌํ‘œ๋œ ํ‹ฐ์ผ“ TOP30์— ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ TOP30 ํ‹ฐ์ผ“์— ๋น„ํ•ด ๊ตฌํ˜„ ๋ฉด์—์„œ ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฝ์Šต๋‹ˆ๋‹ค. :(

๊ทธ๊ฒƒ์€ ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์—†์œผ๋ฉฐ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@cpuguy83 ์˜ˆ. ๊ทธ๊ฒƒ์€ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค / ๋‹ค์†Œ ๊ฑฐ๋ถ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. COPY --exclude ๊ฐ€ ์žˆ๋Š” ์ ์ ˆํ•œ PR์ด ํ’ˆ์งˆ ํ‘œ์ค€์„ ํ†ต๊ณผํ•˜๋ฉด ๋ฐ›์•„๋“ค์—ฌ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๊นŒ?

๋ชจ๋“  ์œ ์ง€ ๊ด€๋ฆฌ์ž์— ๋Œ€ํ•ด ๋งํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ํ•œ ๋‹ฌ ์ •๋„ ์ „์— @tonistiigi ์™€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์œผ๋ฉฐ IIRC๊ฐ€ ์ด๊ฒƒ์ด dockerignore, ๊ตฌ๋ฌธ ๋“ฑ๊ณผ ๊ด€๋ จ๋˜๋Š” ๊ฐ€์žฅ ํฐ ์žฅ์• ๋ฌผ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  dockerignore๊ฐ€ ๊ตฌ๋ฌธ์ ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ์‚ฌ์‹ค).

๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋นŒ๋“œํ‚ท์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

COPY --exclude=... --exclude=... ์ฐฌ์„ฑ - ๋ชจ๋†€๋ฆฌ์Šค ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฐฌ์„ฑ! Bash์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•˜์ง€๋งŒ Docker์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” COPY !(excludedfile) . ๋กœ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Dockerfile ์˜ ๋ชจ๋“  COPY ๋ฌธ์— ๋Œ€ํ•ด Dockerfile .dockerignore ํŒŒ์ผ ๋‚ด์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ˆ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์˜ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ด๊ณ  ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋˜์–ด์„œ๋Š” ์•ˆ ๋  ๋ถ€๋ถ„์œผ๋กœ DRY๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ, imho.

#33923์„ ๋ณด๋ฉด ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ์—์„œ ์ œ์™ธํ•˜๋ ค๋Š” ๊ฒƒ์ด COPY ๋ฌธ์—์„œ ์ œ์™ธํ•˜๋ ค๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์€ ๊ฒƒ์ด ์šฐ์—ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

COPY --use-dockerignore <source> <target>

๋˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

COPY --use-ignorefile=".gitignore" <source> <target>

.dockerignore ๊ฐ€ ์ด๋ฏธ .gitignore ์˜ 90% ์žฌ์ƒ์‚ฐ์ธ ๊ฒƒ์„ ๋ณผ ๋•Œ ๋ฌด์‹œ๋œ ๋ชจ๋“  ํŒŒ์ผ๊ณผ ํด๋”๋ฅผ ๊ฐ๊ฐ์˜ ๋ชจ๋“  COPY ๋ฌธ์— ๋Œ€ํ•ด ๋‹ค์‹œ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์„ฑ๊ฐ€์‹  ์ผ์ž…๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@asbjornu .gitignore์™€ .dockerignore๋Š” ์ „ํ˜€ ๊ฐ™์€ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํŠนํžˆ ๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  git์—๋Š” ์ „ํ˜€ ์—†๋Š” ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ์˜ ๊ฒฝ์šฐ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€์— ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์˜ˆ, ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ๊ฐ€ ๋„์ž…๋˜๋ฉด ๋‹จ๊ณ„๋งˆ๋‹ค ๋‹ค๋ฅธ .dockerignore ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ ˆ๋Œ€์ ์œผ๋กœ.

๋‚˜๋Š” ์ข…์ข… "๋„์ปค ๋นŒ๋“œ" ์™ธ๋ถ€์—์„œ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ .dockerignore๋Š” ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ํ•ฉ๋ฆฌ์ ์ธ ์†”๋ฃจ์…˜์ธ "docker cp"์— ๋Œ€ํ•œ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ๊ณต๊ฐœ๋œ ์ง€ 5๋…„์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 2020๋…„ 9์›”์—๋„ ๋‚˜๋Š” ์ด๊ฒƒ์„ ์›ํ•œ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํ•ดํ‚น์„ ์ œ์•ˆํ–ˆ์ง€๋งŒ ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค๊ณผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  exclude ํ”Œ๋ž˜๊ทธ๋ฅผ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋” ์ด์ƒ ๋ฐฉ์น˜ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์›ํ•˜๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์ž‘์—…ํ•˜๊ฑฐ๋‚˜ ์ž‘์—…ํ•  ์‚ฌ๋žŒ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์ž‘์—…ํ•˜๊ฑฐ๋‚˜ ์ž‘์—…ํ•  ์‚ฌ๋žŒ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ์—…์ŠคํŠธ๋ฆผ์ด ์ด๊ฒƒ์„ ์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์†Œ์Šค ์ฝ”๋“œ ๊ฒ€ํ†  ํ›„ https://github.com/tonistiigi/fsutil/blob/master/copy/copy.go ์—์„œ ๋ณต์‚ฌ ๊ธฐ๋Šฅ์„ ๋จผ์ € ํ™•์žฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„, ์šฐ๋ฆฌ๋Š” libsolver์—์„œ backend.go๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ํ›„์—์•ผ ๋นŒ๋“œํ‚ท์˜ AST์™€ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ํ›„์—๋Š” ๋ณต์‚ฌ๋ณธ์ด ์œ ๋‹‰์Šค cp๋ณด๋‹ค ์˜๋ฏธ๋ก ์ ์œผ๋กœ rsync์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ: ์˜ˆ, copy.go๋ฅผ ํ™•์žฅํ•œ ํ›„ ๋ชจ๋“  ๊ฒƒ์ด https://github.com/moby/buildkit/pull/1492 ์— ๊ฐ€๊น๊ณ  ์ œ์™ธ ๋ชฉ๋ก์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰