Moby: ํŒŒ์ผ globs๊ฐ€ ์žˆ๋Š” Dockerfile COPY๋Š” ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋Œ€์ƒ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

๋ฌธ์ œ์— ๋Œ€ํ•œ ์„ค๋ช…:
$ Dockerfile COPY ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  glob์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ๋ฐ ํด๋”๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ docker๋Š” (๋•Œ๋กœ๋Š”?) ํ•˜์œ„ ํด๋”์—์„œ ๋Œ€์ƒ ํด๋”๋กœ ํŒŒ์ผ๋„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

$ docker version
Client:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 19:47:52 UTC 2015
 OS/Arch:      darwin/amd64

Server:
 Version:      1.8.0
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   0d03096
 Built:        Tue Aug 11 17:17:40 UTC 2015
 OS/Arch:      linux/amd64

$ docker info
Containers: 26
Images: 152
Storage Driver: aufs
 Root Dir: /mnt/sda1/var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 204
 Dirperm1 Supported: true
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 4.0.9-boot2docker
Operating System: Boot2Docker 1.8.0 (TCL 6.3); master : 7f12e95 - Tue Aug 11 17:55:16 UTC 2015
CPUs: 4
Total Memory: 3.858 GiB
Name: dev
ID: 7EON:IEHP:Z5QW:KG4Z:PG5J:DV4W:77S4:MJPX:2C5P:Z5UY:O22A:SYNK
Debug mode (server): true
File Descriptors: 42
Goroutines: 95
System Time: 2015-08-26T17:17:34.772268259Z
EventsListeners: 1
Init SHA1:
Init Path: /usr/local/bin/docker
Docker Root Dir: /mnt/sda1/var/lib/docker
Username: jfchevrette
Registry: https://index.docker.io/v1/
Labels:
 provider=vmwarefusion

$ uname -a
Darwin cerberus.local 14.5.0 Darwin Kernel Version 14.5.0: Wed Jul 29 02:26:53 PDT 2015; root:xnu-2782.40.9~1/RELEASE_X86_64 x86_64

ํ™˜๊ฒฝ ์„ธ๋ถ€์ •๋ณด:
docker-machine์œผ๋กœ ๋นŒ๋“œ๋œ OSX /w boot2docker์˜ ๋กœ์ปฌ ์„ค์ •

๋ฒˆ์‹ ๋ฐฉ๋ฒ•:

๋ฌธ๋งฅ

$ tree
.
โ”œโ”€โ”€ Dockerfile
โ””โ”€โ”€ files
    โ”œโ”€โ”€ dir
    โ”‚ย ย  โ”œโ”€โ”€ dirfile1
    โ”‚ย ย  โ”œโ”€โ”€ dirfile2
    โ”‚ย ย  โ””โ”€โ”€ dirfile3
    โ”œโ”€โ”€ file1
    โ”œโ”€โ”€ file2
    โ””โ”€โ”€ file3

๋„์ปคํŒŒ์ผ

FROM busybox

RUN mkdir /test
COPY files/* /test/

์‹ค์ œ ๊ฒฐ๊ณผ

$ docker run -it copybug ls -1 /test/
dirfile1
dirfile2
dirfile3
file1
file2
file3

์˜ˆ์ƒ ๊ฒฐ๊ณผ
๊ฒฐ๊ณผ ์ด๋ฏธ์ง€๋Š” ์ปจํ…์ŠคํŠธ์™€ ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

arebuilder

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

์ƒˆ๋กœ์šด ์ปค๋งจ๋“œ CP๋ฅผ ๋งŒ๋“ค์–ด ์ด๋ฒˆ์—๋Š” ์ œ๋Œ€๋กœ ํ•ด์ฃผ์„ธ์š”.

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

docker info ๋ฐ uname -a ์˜ ์ถœ๋ ฅ์œผ๋กœ ์›๋ณธ ๋ฉ”์‹œ์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ฌธ์ œ ๋ณด๊ณ  ํ…œํ”Œ๋ฆฟ์— ๋”ฐ๋ผ ํ˜•์‹์„ ๋‹ค์‹œ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” 1.6.2์™€ 1.8์—์„œ ์ด๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค
https://gist.github.com/jrabbit/e4f864ca1664ec0dd288 ๋‘ ๋ฒˆ์งธ ์ˆ˜์ค€ ๋””๋ ‰ํ† ๋ฆฌ๋Š” ์–ด๋–ค ์ด์œ ๋กœ๋“  ์ฒซ ๋ฒˆ์งธ ์ˆ˜์ค€ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์„ ์œ„ํ•ด: COPY * /src์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ COPY / /src๋ฅผ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

@jfchevrette ์™œ ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์•Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
COPY files/* /test/ ๊ฐ€ COPY files/dir files/file1 files/file2 files/file /test/ ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๊ฐœ๋ณ„ COPY ๋ช…๋ น(์˜ˆ: COPY files/dir /test/ )์œผ๋กœ ๋ถ„ํ• ํ•˜๋ฉด COPY๊ฐ€ ๊ฐ arg dir์˜ ๋‚ด์šฉ์„ ๋Œ€์ƒ dir์— ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. arg ๋””๋ ‰ํ† ๋ฆฌ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๊ณ„์† ์œ ์ง€๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” COPY๊ฐ€ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ณด์กดํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์— ํฅ๋ถ„ํ•˜์ง€ ์•Š์ง€๋งŒ ์ง€๊ธˆ์€ ํ•œ๋™์•ˆ ๊ทธ๋Ÿฐ ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•˜๋ฉด src ํŠธ๋ฆฌ์—์„œ ํ•œ ๋‹จ๊ณ„ ๋” ๋†’์€ ์ˆ˜์ค€์œผ๋กœ ๋ณต์‚ฌํ•˜์—ฌ ์ด ์ž‘์—…์„ ๋œ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” @duglin ์ด ์˜ณ๋‹ค๊ณ  ํ™•์‹ ํ•˜๋ฉฐ ๊ทธ ํ–‰๋™์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ dockerfiles๋Š” ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ์†์ƒ์‹œํ‚ค๊ฑฐ๋‚˜ ๋‹จ์ˆœํžˆ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์žฅ๊ธฐ์ ์œผ๋กœ COPY๊ฐ€ cp ๋˜๋Š” rsync์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ํด๋”์—์„œ glob ๋ฐ ํ›„ํ–‰ ์Šฌ๋ž˜์‹œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. COPY๊ฐ€ dir/*๊ณผ ์ผ์น˜ํ•˜๋Š” ํ•˜์œ„ ํด๋”์—์„œ ๋Œ€์ƒ IMO๋กœ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ์˜ˆ์ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@jfchevrette ์˜ˆ - ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ "์ˆ˜์ •"ํ•ด์•ผ ํ•  ์ฒซ ๋ฒˆ์งธ ๊ธฐํšŒ์ž…๋‹ˆ๋‹ค.
์ผ๋‹จ ๋‹ซ๋Š”๋‹ค...

@duglin ๊ทธ๋ž˜์„œ ๋‹ซ๋Š” ๊ฒƒ์€ ์ˆ˜์ •๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

@tugberkugurlu ๋„ค , ์ ์–ด๋„ ์ง€๊ธˆ์€. ์ „์ฒด ๋นŒ๋“œ ์ธํ”„๋ผ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ด๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ํ•  ๋•Œ COPY(๋˜๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” ์ƒˆ ํ•ญ๋ชฉ)๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@duglin ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๊ณ„์† ์—ด์–ด๋‘๊ณ  ์—ฌ๊ธฐ์—์„œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@tugberkugurlu "ํด๋ผ์ด์–ธํŠธ ์ธก ๋นŒ๋” ์ง€์›"์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ROADMAP( https://github.com/docker/docker/blob/master/ROADMAP.md#22-dockerfile-syntax )์—์„œ ๋งํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ๊ณ„์† ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•ด์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Docker๊ฐ€ ๋”ฐ๋ฅด๊ณ  ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์€ ์ฆ‰์‹œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ–ฅํ›„ ์ž‘์—…์„ ์œ„ํ•œ ๋ฌธ์ œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ซํ˜”๋‹ค๊ฐ€ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ผ๋ถ€ ์กฐ์น˜(PR)๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒํ™ฉ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋‹ค์‹œ ์—ด๋ฆฝ๋‹ˆ๋‹ค.

@duglin ์ด๊ฒƒ์€ ๋งค์šฐ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ 0.1 ๋ฆด๋ฆฌ์Šค์—์„œ ๋„์ž…๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ๋‹ซ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. 2.0 ๋ฆด๋ฆฌ์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ์ ˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด์ •ํ‘œ๋Š” github์—๋„ ์žˆ์Šต๋‹ˆ๋‹ค).

๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

COPY . /app

.gitignore ์— ์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ํด๋”๋ฅผ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋‹จ์ผ ๋ ˆ๋ฒจ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์‹ค์ œ๋กœ mv ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ์žˆ๋Š” $ COPY ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

COPY src /myapp

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

duglin์ด 2015๋…„ 9์›” 1์ผ์— ๋‹ซ์•˜์Šต๋‹ˆ๋‹ค.

@duglin ์ด๊ฒƒ์€ ์šฐ์Šค๊ฝ์Šค๋Ÿฝ๊ณ  ํ™”๋‚˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ ๋‹ซ์œผ๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค. COPY ๋ช…๋ น์€ ๋ฌธ์„œํ™”๋œ ์‚ฌ์šฉ๋ฒ• ๋ฐ ์˜ˆ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๋•Œ ๊ตฌ์ฒด์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@tjwebb ์•„์ง ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค https://github.com/docker/docker/issues/29211. ์ด๊ฒƒ์€ ์™„์ „ํžˆ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋Š” _๋ฐฉ๋ฒ•_ ์ œ์•ˆ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ œ์•ˆ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. cp ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์—์„œ (์˜ˆ๋ฅผ ๋“ค์–ด) OS X ๋ฐ Linux ์‚ฌ์ด์—๋Š” ์ด๋ฏธ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

mkdir -p repro-15858 \
  && cd repro-15858 \
  && mkdir -p source/dir1 source/dir2 \
  && touch source/file1 source/dir1/dir1-file1 \
  && mkdir -p target1 target2 target3 target4 target5 target6

cp -r source target1 \
&& cp -r source/ target2 \
&& cp -r source/ target3/ \
&& cp -r source/* target4/ \
&& cp -r source/dir* target5/ \
&& cp -r source/dir*/ target6/ \
&& tree

OS X:

.
โ”œโ”€โ”€ source
โ”‚ย ย  โ”œโ”€โ”€ dir1
โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ dir1-file1
โ”‚ย ย  โ”œโ”€โ”€ dir2
โ”‚ย ย  โ””โ”€โ”€ file1
โ”œโ”€โ”€ target1
โ”‚ย ย  โ””โ”€โ”€ source
โ”‚ย ย      โ”œโ”€โ”€ dir1
โ”‚ย ย      โ”‚ย ย  โ””โ”€โ”€ dir1-file1
โ”‚ย ย      โ”œโ”€โ”€ dir2
โ”‚ย ย      โ””โ”€โ”€ file1
โ”œโ”€โ”€ target2
โ”‚ย ย  โ”œโ”€โ”€ dir1
โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ dir1-file1
โ”‚ย ย  โ”œโ”€โ”€ dir2
โ”‚ย ย  โ””โ”€โ”€ file1
โ”œโ”€โ”€ target3
โ”‚ย ย  โ”œโ”€โ”€ dir1
โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ dir1-file1
โ”‚ย ย  โ”œโ”€โ”€ dir2
โ”‚ย ย  โ””โ”€โ”€ file1
โ”œโ”€โ”€ target4
โ”‚ย ย  โ”œโ”€โ”€ dir1
โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ dir1-file1
โ”‚ย ย  โ”œโ”€โ”€ dir2
โ”‚ย ย  โ””โ”€โ”€ file1
โ”œโ”€โ”€ target5
โ”‚ย ย  โ”œโ”€โ”€ dir1
โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ dir1-file1
โ”‚ย ย  โ””โ”€โ”€ dir2
โ””โ”€โ”€ target6
    โ””โ”€โ”€ dir1-file1

20 directories, 12 files

์šฐ๋ถ„ํˆฌ(/bin/sh)์—์„œ

.
|-- source
|   |-- dir1
|   |   `-- dir1-file1
|   |-- dir2
|   `-- file1
|-- target1
|   `-- source
|       |-- dir1
|       |   `-- dir1-file1
|       |-- dir2
|       `-- file1
|-- target2
|   `-- source
|       |-- dir1
|       |   `-- dir1-file1
|       |-- dir2
|       `-- file1
|-- target3
|   `-- source
|       |-- dir1
|       |   `-- dir1-file1
|       |-- dir2
|       `-- file1
|-- target4
|   |-- dir1
|   |   `-- dir1-file1
|   |-- dir2
|   `-- file1
|-- target5
|   |-- dir1
|   |   `-- dir1-file1
|   `-- dir2
`-- target6
    |-- dir1
    |   `-- dir1-file1
    `-- dir2

24 directories, 12 files
diff --git a/macos.txt b/ubuntu.txt
index 188d2c3..d776f19 100644
--- a/macos.txt
+++ b/ubuntu.txt
@@ -11,15 +11,17 @@
 โ”‚       โ”œโ”€โ”€ dir2
 โ”‚       โ””โ”€โ”€ file1
 โ”œโ”€โ”€ target2
-โ”‚   โ”œโ”€โ”€ dir1
-โ”‚   โ”‚   โ””โ”€โ”€ dir1-file1
-โ”‚   โ”œโ”€โ”€ dir2
-โ”‚   โ””โ”€โ”€ file1
+โ”‚   โ””โ”€โ”€ source
+โ”‚       โ”œโ”€โ”€ dir1
+โ”‚       โ”‚   โ””โ”€โ”€ dir1-file1
+โ”‚       โ”œโ”€โ”€ dir2
+โ”‚       โ””โ”€โ”€ file1
 โ”œโ”€โ”€ target3
-โ”‚   โ”œโ”€โ”€ dir1
-โ”‚   โ”‚   โ””โ”€โ”€ dir1-file1
-โ”‚   โ”œโ”€โ”€ dir2
-โ”‚   โ””โ”€โ”€ file1
+โ”‚   โ””โ”€โ”€ source
+โ”‚       โ”œโ”€โ”€ dir1
+โ”‚       โ”‚   โ””โ”€โ”€ dir1-file1
+โ”‚       โ”œโ”€โ”€ dir2
+โ”‚       โ””โ”€โ”€ file1
 โ”œโ”€โ”€ target4
 โ”‚   โ”œโ”€โ”€ dir1
 โ”‚   โ”‚   โ””โ”€โ”€ dir1-file1
@@ -30,6 +32,8 @@
 โ”‚   โ”‚   โ””โ”€โ”€ dir1-file1
 โ”‚   โ””โ”€โ”€ dir2
 โ””โ”€โ”€ target6
-    โ””โ”€โ”€ dir1-file1
+    โ”œโ”€โ”€ dir1
+    โ”‚   โ””โ”€โ”€ dir1-file1
+    โ””โ”€โ”€ dir2

-20 directories, 12 files
+24 directories, 12 files

์ƒˆ๋กœ์šด ์ปค๋งจ๋“œ CP๋ฅผ ๋งŒ๋“ค์–ด ์ด๋ฒˆ์—๋Š” ์ œ๋Œ€๋กœ ํ•ด์ฃผ์„ธ์š”.

๋‚˜๋Š” ์œ„์˜ ๋‚ด์šฉ์„ ๋˜ํ’€์ดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌด์ˆ˜ํ•œ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ์„œ +1. ์ด๊ฒƒ์€ ์ •๋ง ์–ด๋ฆฌ์„์€ ํ–‰๋™์ด๋ฉฐ COPY๊ฐ€ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ์‹์„ ์ˆ˜ํ–‰ํ•˜๋Š” CP ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ"์€ ๊ฒฝ์ฐฐ ์•„์›ƒ์ž…๋‹ˆ๋‹ค.

TL;DR ๋ฒ„์ „:

COPY * /app ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋””๋ ‰ํ† ๋ฆฌ ํŠธ๋ฆฌ๋ฅผ ๋ณด์กดํ•˜๋ ค๋ฉด ๋Œ€์‹  COPY . /app ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

COPY๋Š” ํ•˜์œ„ ํด๋”๋งŒ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ์ˆ˜๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค... ์ด๊ฒƒ์ด ์™œ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” Paket ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋‹ค์Œ์„ ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ์กฐ๋กœ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

.
โ”œโ”€โ”€ .paket/
โ”‚   โ”œโ”€โ”€ paket.exe
โ”‚   โ”œโ”€โ”€ paket.bootstrapper.exe
โ”œโ”€โ”€ paket.dependencies
โ”œโ”€โ”€ paket.lock
โ”œโ”€โ”€ projectN/

COPY *paket* ./ ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ๋‹ค์Œ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

.
โ”œโ”€โ”€ paket.dependencies
โ”œโ”€โ”€ paket.lock

COPY ๋ฐ ADD ์— --glob ๋˜๋Š” --recursive ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋ณต์‚ฌ . /destination์€ ํ•˜์œ„ ํด๋”๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

3๋…„์ด ์ง€๋‚ฌ์ง€๋งŒ ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฌธ์ œ์ž…๋‹ˆ๋‹ค :-/

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ ETA๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ณ„์ผ ์•„๋‹ˆ๋‹ค...
์œ„์—์„œ...
๋ณต์‚ฌ .

์‚ฌ์‹ค, ๋ฐ˜๋‚˜์ ˆ ๋™์•ˆ ์—ฐ๊ธฐ๋ฅผ ๋‚ด๊ณ  ์—ฌ๊ธฐ๊นŒ์ง€ ์˜จ ํ›„์—๋Š” ๋” ์ด์ƒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™•์‹ ํ•˜๋Š” :)
๊ฑด์„ค์ ์œผ๋กœ ํ•˜์ž,

image

์ƒˆ _CP_ ๋ช…๋ น์ด๋‚˜ _COPY_์— ๋Œ€ํ•œ --recursive ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฏธ์ง€ ๋นŒ๋“œ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋„ ํ‘œ์‹œํ•˜๋Š” ๊ฒฝ์šฐ ์ฃผ์š” ํฌ์ธํŠธ:
์˜ค์šฉ ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ์ง€๋˜๋ฉด Directory structure not preserved with COPY *, use CP or COPY . More here <link>. .

์ข…์†์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ํŠธ๋ฆฌ๊ฑฐํ•˜๋„๋ก npm install ์บ์‹œ๋ฅผ ๋” ์ž˜ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ค‘์ฒฉ๋œ lerna package.json ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ณ€๊ฒฝ๋œ ๋ชจ๋“  ํŒŒ์ผ๋กœ ์ธํ•ด ์ข…์†์„ฑ์ด ๋‹ค์‹œ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

COPY ["package.json", "packages/*/package.json", "/app/"]

#29211์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ํ์‡„๋˜์—ˆ๊ณ  ์•„๋ฌด๋„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@zentby ๋Œ€ํ™”๊ฐ€ ์—ฌ๊ธฐ ์žˆ๊ณ  ๋ฌธ์ œ๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ ์ถ”์ ๋ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์€ ๋‹ซํ˜€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—)... ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ COPY ํŒŒ์ผ ๋ฐ RUN cp -R ๋ช…๋ น์ž…๋‹ˆ๋‹ค.

COPY files /tmp/
RUN cp -R /tmp/etc/* /etc/ && rm -rf /tmp/etc

์บ์‹œ๋ฅผ ๋ฌดํšจํ™”ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ํŒŒ์ผ์ด ๋‹ค๋ฅผ ๋•Œ COPY ๋ช…๋ น์ด ์บ์‹œ๋ฅผ ํŒŒ๊ดด ํ•˜๋ฏ€๋กœ @instabledesign ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” npm ์ข…์†์„ฑ ์„ค์น˜์™€ ๊ด€๋ จ๋œ ํŒŒ์ผ๋งŒ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค)

๋˜ํ•œ ์บ์‹œ๋ฅผ ์™œ๊ณกํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ ์„ธํŠธ(๋‚ด ๊ฒฝ์šฐ์—๋Š” *.sln ๋ฐ *.csproj dotnet ์ฝ”์–ด์šฉ)๋งŒ ๋ณต์‚ฌํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์›ํ•˜๋Š” ํŒŒ์ผ์˜ tar ๋ณผ์„ ๋งŒ๋“  ๋‹ค์Œ Docker ํŒŒ์ผ์— tarball์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ, ์ด์ œ Docker ํŒŒ์ผ ์™ธ์— ์…ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค...

๋นŒ๋“œ.sh

#!/bin/bash

# unfortunately there's no easy way to copy just the *.sln and *.csproj (see https://github.com/moby/moby/issues/15858)
# so we generate a tar file containing the required files for the layer

find .. -name '*.csproj' -o -name 'Finomial.InternalServicesCore.sln' -o -name 'nuget.config' | sort | tar cf dotnet-restore.tar -T - 2> /dev/null

docker build -t finomial/iscore-build -f Dockerfile ..

๋„์ปค ํŒŒ์ผ

FROM microsoft/aspnetcore-build:2.0
WORKDIR /src

# set up a layer for dotnet restore 

ADD docker/dotnet-restore.tar ./

RUN dotnet restore

# now copy all the source and do the dotnet buld
COPY . ./

RUN dotnet publish --no-restore -c Release -o bin Finomial.InternalServicesCore.sln

์—ฌ๋Ÿฌ COPY ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ตœ์ข… ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ๋ถ€ํ’€๋ฆฌ๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ kayjtea์™€ ๊ฐ™์ด docker build ๋ช…๋ น์„ ๋„์šฐ๋ฏธ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์— ๋ž˜ํ•‘ํ•˜์—ฌ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ณด์กดํ•˜๋Š” tarball์„ ๋งŒ๋“ค๊ณ  ADD ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  docker-compose build ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ COPY ๋Š” POSIX ํ˜ธํ™˜ /bin/cp -r ๋ช…๋ น์ฒ˜๋Ÿผ ์ž‘๋™ํ•ด์•ผ ํ•˜์ง€๋งŒ ํ˜„์žฌ ๋™์ž‘์ด ๊ฒฝํ—˜์ด ์žˆ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ์™„์ „ํžˆ ์ง๊ด€์ ์ด์ง€ ์•Š๋”๋ผ๋„ '์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ'์—์„œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. *nix ์‹œ์Šคํ…œ์—์„œ.


๋‚ด๊ฐ€ ์ฐพ์€ ์ตœ๊ณ ์˜ ์ ˆ์ถฉ์•ˆ์€ ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ๋ฅผ ํ•ดํ‚น์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

FROM scratch as project_root
# Use COPY to move individual directories
# and WORKDIR to change directory
WORKDIR /
COPY ./file1 .
COPY ./dir1/ ./dir1/
COPY ./dir2/ .
WORKDIR /newDir
COPY ./file2 .

# The actual final build you end up using/pushing
# Node.js app as example
FROM node
WORKDIR /opt/app

COPY package.json .
RUN npm install

COPY --from=project_root / .
CMD ["npm", "start"]

์ด๊ฒƒ์€ ํ•˜๋‚˜์˜ Dockerfile ๋‚ด์— ์ž์ฒด ํฌํ•จ๋˜๋ฉฐ ADD project.tar ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ตœ์ข… ์ด๋ฏธ์ง€์— ํ•˜๋‚˜์˜ ๋ ˆ์ด์–ด๋งŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์™„์ „ํ•œ COPY ๋ช…๋ น์ด ์žˆ์œผ๋ฉด ๋„์ปค ๋นŒ๋“œ ์บ์‹œ๋ฅผ ๋ณด์กดํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ •๋ง ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ROS ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ํŒจํ‚ค์ง€์˜ ์ค‘์ฒฉ๋œ ์ž‘์—… ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ๋˜๋ฉฐ, ๊ฐ ํŒจํ‚ค์ง€๋Š” ์ž์ฒด package.xml ํŒŒ์ผ์—์„œ ์ข…์†์„ฑ์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒŒ์ผ์€ ์ข…์†์„ฑ ๊ด€๋ฆฌ์ž์—์„œ ์—…์ŠคํŠธ๋ฆผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ package.xml ํŒŒ์ผ์€ ๊ธฐ์ดˆ๊ฐ€ ์„ค์ •๋˜๋ฉด ํŒจํ‚ค์ง€ ์ž์ฒด์˜ ์ฝ”๋“œ๋กœ ๋น„๊ต์  ๋“œ๋ฌผ๊ฒŒ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ๋ณต์‚ฌํ•˜๋Š” ๋™์•ˆ ๋””๋ ‰ํ† ๋ฆฌ ํŠธ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ๋ณด์กด๋œ ๊ฒฝ์šฐ ์บ์‹ฑ์„ ์ตœ๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ปค ๋นŒ๋“œ ์ค‘์— ์ž‘์—… ๊ณต๊ฐ„์„ ๋‘ ๋‹จ๊ณ„๋กœ ๊ฐ„๋‹จํžˆ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

# copy project dependency metadata
COPY ./**/package.xml /opt/ws/

# install step that fetches unsatisfied dependency
RUN dependency_manager install --workspace /opt/ws/

# copy the rest of the project's code
COPY ./ /opt/ws/

# compile code with cached dependencies
RUN build_tool build --workspace /opt/ws/

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

ํ˜„์žฌ, ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  package.xml ํŒŒ์ผ์ด ๋Œ€์ƒ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ฃจํŠธ์— ์„œ๋กœ ๊ฒน์ณ์„œ ๋ณต์‚ฌ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋งˆ์ง€๋ง‰ ๊ธ€๋กœ๋ธŒ ํŒŒ์ผ์€ ์ด๋ฏธ์ง€์— ์ง€์†๋˜๋Š” ์œ ์ผํ•œ package.xml ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ •๋ง ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ๋ณต์‚ฌ๋œ ํŒŒ์ผ์„ ์„œ๋กœ ๋ฎ์–ด์“ฐ๋Š” ์ด์œ ์™€ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์ด ๊ฒฐ๊ตญ ์ด๋ฏธ์ง€์— ์ง€์†๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์Šคํƒ์—์„œ ๋งค์šฐ ๊ณ ํ†ต์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ณ‡. 2015๋…„๋ถ€ํ„ฐ ํ™”์ œ๊ฐ€ ๋˜์—ˆ๋˜! CP ์˜ ์ƒˆ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? COPY ๋ช…๋ น์ด glob๊ณผ ๊ฐ™์ด ๋„๋ฆฌ ์ฑ„ํƒ๋œ ์‹ค์ œ ํ‘œ์ค€์ด ์•„๋‹ˆ๋ผ ๊ฒฝ๋กœ ์ผ์น˜๋ฅผ ์œ„ํ•ด golang ๋‚ด๋ถ€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ง€๋ฃจํ•œ ๋™์ž‘์ž…๋‹ˆ๋‹ค.

์บ์‹ฑ์ด ์ •ํ™•ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฐ•๋ ฅํ•˜์ง€ ์•Š๋”๋ผ๋„ ์‹คํ—˜์  ๋นŒ๋“œํ‚ท ๊ตฌ๋ฌธ์œผ๋กœ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธ€๋กœ๋น™์„ ํ†ตํ•ด ๋ณต์‚ฌํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์€ ์—ฌ๊ธฐ์—์„œ ์ฃผ์„์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/moby/moby/issues /39530#์ด์Šˆ ๋Œ“๊ธ€ -530606189

์„ ํƒ์ ์ธ glob ์Šคํƒ€์ผ ๋ณต์‚ฌ๋ณธ์— ์บ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ์—ด๋ ธ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/moby/moby/issues/15858#issuecomment -462017830 via multi-stage builds ์—์„œ ๋‚ด ์˜ˆ์ œ์— ๋Œ€ํ•œ ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊นจ๋‹ฌ์•˜๊ณ  ์—ฌ๊ธฐ ๋น„์Šทํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ๋Š” ๋งŽ์€ ๋ถ„๋“ค์ด ๋ณต์‚ฌ๋œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž„์˜์˜ ์บ์‹ฑ์— ๊ฐ์‚ฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ์˜ ์•„ํ‹ฐํŒฉํŠธ. ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์บ์‹œํ•  ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ํ•„ํ„ฐ๋ง/์ „์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# Add prior stage to cache/copy from
FROM ubuntu AS package_cache

# Copy from build context
WORKDIR /tmp
COPY ./ ./src

# Filter or glob files to cache upon
RUN mkdir ./cache && cd ./src && \
    find ./ -name "package.xml" | \
      xargs cp --parents -t ../cache

# Continue with primary stage
FROM ubuntu

# copy project dependency metadata
COPY --from=package_cache /tmp/cache /opt/ws/

# install step that fetches unsatisfied dependency
RUN dependency_manager install --workspace /opt/ws/

# copy the rest of the project's code
COPY ./ /opt/ws/

# compile code with cached dependencies
RUN build_tool build --workspace /opt/ws/

์‹ค์ œ ์ž‘์—… ์˜ˆ๋ฅผ ๋ณด๋ ค๋ฉด ์—ฌ๊ธฐ๋ฅผ https://github.com/ros-planning/navigation2/pull/1122

์ข…์†์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ํŠธ๋ฆฌ๊ฑฐํ•˜๋„๋ก npm install ์บ์‹œ๋ฅผ ๋” ์ž˜ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ค‘์ฒฉ๋œ lerna package.json ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ณ€๊ฒฝ๋œ ๋ชจ๋“  ํŒŒ์ผ๋กœ ์ธํ•ด ์ข…์†์„ฑ์ด ๋‹ค์‹œ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

COPY ["package.json", "packages/*/package.json", "/app/"]

๋‚˜๋Š” ๋˜‘๊ฐ™์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ข…์†์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ํŠธ๋ฆฌ๊ฑฐํ•˜๋„๋ก npm install ์บ์‹œ๋ฅผ ๋” ์ž˜ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ค‘์ฒฉ๋œ lerna package.json ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ณ€๊ฒฝ๋œ ๋ชจ๋“  ํŒŒ์ผ๋กœ ์ธํ•ด ์ข…์†์„ฑ์ด ๋‹ค์‹œ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

COPY ["package.json", "packages/*/package.json", "/app/"]

์ด ๊ฒฝ์šฐ๋Š” Yarn ์ž‘์—… ๊ณต๊ฐ„์˜ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

2020๋…„์ธ๋ฐ ์•„์ง ์ˆ˜์ •์ด ์•ˆ๋๋„ค์š”.

dotnet ์„ค์ •์—์„œ ์ด ๋ฌธ์ œ๋กœ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋Š” ๊ฒฝ์šฐ *.csproj ํŒŒ์ผ์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ณต์›ํ•˜์—ฌ ๋ณต์›์ด ๋’ค๋”ฐ๋ฅผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” dotnet ํ•ต์‹ฌ ์ „์—ญ ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์—์„œ ์ˆ˜ํ–‰ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ฐธ๊ณ ๋กœ, ์ด๋ก ์ ์œผ๋กœ ์œ ์‚ฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋‹ค๋ฅธ ์„ค์ •์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณธ์งˆ์ ์œผ๋กœ ์ด ๋„๊ตฌ๋Š” ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋งํ•˜๋ฏ€๋กœ lerna ๋˜๋Š” yarn ์ž‘์—… ๊ณต๊ฐ„ ์„ค์ •์ด ์–ผ๋งˆ๋‚˜ ์‰ฝ๊ณ  ๊ฐ€๋Šฅํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์กฐ์‚ฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด dotnet core ๋Ÿฐํƒ€์ž„์„ ์„ค์น˜ํ•˜์—ฌ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋ฉด ๋™์ผํ•œ ๋„๊ตฌ์—์„œ ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ถ”์ธกํ•œ๋‹ค.

๋ณต์‚ฌ ๋ช…๋ น์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด 1ํ•™๋…„ ํ•™์ƒ์˜ ์ž‘์—…์ด์—ˆ๋˜ ๊ฒƒ์ด ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ด์ œ๋Š” ๋‹ค๋…„๊ฐ„์˜ ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ์ˆ™๋ จ๋œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค...

์•„๋งˆ๋„ ๊ฐ€์žฅ ๋‹นํ˜น์Šค๋Ÿฌ์šด ๋ฒ„๊ทธ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ถœ๋ ฅ ์—†์ด ์ˆ˜๋…„ ๊ฐ„์˜ ํ† ๋ก ์ด ๊ณ„์†๋˜์—ˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ํ™•์‹คํžˆ ์ƒ์œ„๊ถŒ์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.

@benmccallum
์ฐธ๊ณ ๋กœ, ์ด๋ก ์ ์œผ๋กœ ์œ ์‚ฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋‹ค๋ฅธ ์„ค์ •์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋„๊ตฌ๋Š” ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ https://github.com/moby/moby/issues/15858#issuecomment -532016362์—์„œ ์ œ์•ˆํ•œ ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์ „ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ dotnet restore ์˜ ๊ฒฝ์šฐ ๋น„๊ต์  ์‰ฌ์šด ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

# Prefiltering stage using find -exec and cp --parents to copy out
# the project files in their proper directory structure.
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS dotnet-prep
COPY . ./src/
RUN mkdir ./proj && cd ./src && \
  find . -type f -a \( -iname "*.sln" -o -iname "*.csproj" \) \
    -exec cp --parents "{}" ../proj/ \;

# New build stage, independent cache
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS dotnet-build

# Copy only the project files with correct directory structure
# then restore packages
COPY --from=dotnet-prep ./proj ./src/
RUN dotnet restore

# Copy everything else
COPY --from=dotnet-prep ./src ./src/
# etc.

๊ทธ๋ž˜๋„ Docker๊ฐ€ ์ •์ƒ์ ์ด๊ณ  ์ •์ƒ์ ์ธ ๋™๊ธฐํ™” ์˜๋ฏธ๋ฅผ ๋”ฐ๋ฅด๋Š” COPY ๋ช…๋ น์— ์ ์ ˆํ•œ ๋ณ€ํ˜•์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ์ ์ ˆํ•œ ๋ณ€๋ช…์„ ๋งŒ๋“ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ๋ง์€; ์–ด์„œ ํ•ด๋ด์š”!

@rjgotten , ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค! ํ™•์‹คํžˆ ๋‚ด๊ฐ€ ํ•œ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์‰ฝ๊ณ  ์ด๊ฒƒ์ด ๋‚ด ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด์ผ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•  ๊ฒƒ์ด๊ณ  ์ด๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์ถ”์ฒœํ•˜๋„๋ก ๋‚ด ๋ฌธ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ์ดˆ๊ธฐ ๋ฌธ์ œ๋Š” Windows์— ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ๋„ ๊ทธ ์ œ์•ˆ์„ ๊ธฐ๊ฐํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋” ์ด์ƒ ์•„๋‹ˆ์ง€๋งŒ ์™„์ „์„ฑ์„ ์œ„ํ•ด ๋™๋“ฑํ•œ Windows ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ? PowerShell์ด โ€‹โ€‹dotnet core ์ด๋ฏธ์ง€์— ๋ฏธ๋ฆฌ ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค...

๊ทธ๋ž˜๋„ ์ถ”๊ฐ€/๋ฐ˜๋ณต๋˜๋Š” FROM์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? RUN์„ ํ•  ๋•Œ๋งˆ๋‹ค ์บ์‹ฑ์„ ์œ„ํ•œ ์ƒˆ ๋ ˆ์ด์–ด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋งž์ฃ ? ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋žœ๋งŒ์ž…๋‹ˆ๋‹ค!

PowerShell์ด โ€‹โ€‹dotnet core ์ด๋ฏธ์ง€์— ๋ฏธ๋ฆฌ ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค...

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ”Œ๋žซํผ ๊ฐ„ ๋ฐฉ์‹์œผ๋กœ ์ด ์ž‘์—…์„ ์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์ถ”๊ฐ€/๋ฐ˜๋ณต๋˜๋Š” FROM์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

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

๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ํ”„๋กœ์ ํŠธ ๊ด€๋ จ ํŒŒ์ผ์„ _only_ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ํ•ด๋‹น ํŒŒ์ผ์ด ๋™์ผํ•œ ํ•œ, ์ฆ‰ ๋™์ผํ•œ ํŒŒ์ผ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ๋‚ด์šฉ; ๋“ฑ - ํ•ด๋‹น ๋ ˆ์ด์–ด๊ฐ€ ๋ฌดํšจํ™”๋˜์ง€ _์•Š์€_ ๋นŒ๋“œ ์ „๋ฐ˜์— ๊ฑธ์ณ. ์ด๋Š” ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์ด ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํ•œ dotnet restore ๋ ˆ์ด์–ด _๋˜ํ•œ_์ด ๋ฌดํšจํ™”๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ ์ ‘๊ทผ๋ฒ•
์ดˆ๊ธฐ COPY cmd๋Š” ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด _๋ชจ๋“  ๊ฒƒ_์„ ๋ณต์‚ฌํ•œ ๋‹ค์Œ .sln ๋ฐ .csproj ํŒŒ์ผ์„ ๋ณ„๋„์˜ /proj ํด๋”๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ด ๋‹จ๊ณ„๊ฐ€ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ์ •์ ์œผ๋กœ ์ด๊ฒƒ์ด ํ•ด๊ฒฐํ•˜๋Š” ํ•œ๊ณ„๋Š” ๋ฉ‹์ง„ RUN linux cmd๊ฐ€ ํƒ์š•์Šค๋Ÿฌ์šด COPY ์ด์ „์— ๊ฐ€์ ธ์˜จ ํŒŒ์ผ _์ด๋ฏธ ๋„์ปค ์ด๋ฏธ์ง€์— ์žˆ๋Š” ํŒŒ์ผ์—์„œ๋งŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒˆ ๋‹จ๊ณ„๊ฐ€ ์‹œ์ž‘๋˜๊ณ  dotnet restore ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” /proj ํด๋” ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์บ์‹œ "ํ‚ค"๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒŒ์ผ ํ•ด์‹œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ์บ์‹œ ๊ณ„์ธต์ด๋‚˜ ํ›„์† dotnet restore ๊ณ„์ธต์„ ๊ฑฐ์˜ ํŒŒ๊ดดํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฐ’๋น„์‹ผ ๋ณต์›์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ‹์ง„!

๋‚˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹
dotnet ๋ณต์›์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ COPY ๋ช…๋ น์„ ๋” ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ํ•˜๋‚˜์˜ ๋นŒ๋“œ ๋‹จ๊ณ„๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋ชจ๋“  .csproj ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณ‘ํ•ฉํ•œ ๋‹ค์Œ ์ „์—ญ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ญ๋ชฉ .sln ํŒŒ์ผ์—์„œ ์˜ฌ๋ฐ”๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํ›„์—์•ผ ๋ชจ๋“  src ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๋ฏ€๋กœ ๋ชจ๋“  src ํŒŒ์ผ์„ ํ•ญ์ƒ ๋ณต์‚ฌํ•ด์•ผ ํ•˜๋Š” ๋Œ€์‹  ์—ฌ๊ธฐ๊นŒ์ง€ ์ •๊ธฐ์ ์œผ๋กœ ๋ ˆ์ด์–ด๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์บ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ดํฌ์•„์›ƒ
๊ฐ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์–ผ๋งˆ๋‚˜ ํšจ๊ณผ์ ์ธ์ง€๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋‹ฌ๋ ค ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋…ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—๋Š” "all src over" COPY์—์„œ ๋ณต์‚ฌ๋˜๋Š” ๋งŽ์€ ๊ณต์œ  ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. .dockerignore๋Š” ์—ฌ๊ธฐ์—์„œ ๋„์›€์ด ๋˜์ง€๋งŒ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ COPY์—์„œ ๊ฝค "ํƒ์š•์ "์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฝค ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ์•ฝ๊ฐ„ ๋” ๋ณต์žกํ•˜๊ธด ํ•˜์ง€๋งŒ ์ด ๋Œ€์•ˆ๋ณด๋‹ค ๋” ๋น ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋นŒ๋“œํ‚ท ์กฐ์‚ฌ
RUN --mount=type=bind - ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•ด ๋ฉ‹์ง„ Linux cmd๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( RUN ๊ฐ€ ์ด๋ฏธ์ง€์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ ์ œํ•œ๋˜๋Š” ๋Œ€์‹ ). ์‹ค์ œ๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

RUN --mount=type=cache - ์ผ์ข…์˜ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์บ์‹œ ๋””๋ ‰ํ† ๋ฆฌ(๋„์ปค ๋นŒ๋“œ ๊ฐ„์—?)๊ฐ€ ๋ณด์กด๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋‚˜์š”? ๋”ฐ๋ผ์„œ ๋ณธ์งˆ์ ์œผ๋กœ ํŒจํ‚ค์ง€ ๋ณต์›์„ ์œ„ํ•œ ์บ์‹œ ๊ณ„์ธต์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด์ „์— ๋ณต์›๋œ ํŒจํ‚ค์ง€ ์บ์‹œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ ํ›จ์”ฌ ๋” ๋นจ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค!?

๋ฌธ์ œ๊ฐ€ "๋‹ซํžŒ" ์ƒํƒœ์ด๊ณ  ์‚ฌ๋žŒ๋“ค์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ์ต์ˆ™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝํ–ฅ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ๋•Œ.

์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ๋ช‡ ๋…„์ด ์ง€๋‚œ ํ›„์—๋„ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด ๋ฏฟ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? docker๋Š” ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ณต์‚ฌ๊ฐ€ cp -r ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋„๋ก Earthly์— COPY --dir ์˜ต์…˜ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์ด Dockerfile์—๋„ ์ด์‹๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build

# Nugets restore
WORKDIR /src/allprojects          # just temporary storage for .csproj files
COPY */*.csproj ./
RUN for file in $(ls *.csproj); do dotnet restore ${file}; done

# Build/Publish
WORKDIR /src/solution             # actual folder with source code and full hierarchy 
COPY . .
RUN dotnet publish "MyProject/MyProject.csproj" -c Release -o /bublish/myproject

# Run Application
FROM mcr.microsoft.com/dotnet/core/runtime:3.1 AS base
WORKDIR /app
COPY --from=build /bublish/myproject .
ENTRYPOINT ["dotnet", "MyProject.dll"]

@zatuliveter
ํด๋” ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๋ฝ๋œ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ; ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

.NET Core๋Š” ๊ฐ ํ”„๋กœ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ ./obj ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํŒจํ‚ค์ง€ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜๋˜์–ด ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๋ฏฟ์ง€ ์•Š์œผ์‹ญ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ ./obj ํด๋”๋ฅผ ๋ฒ„๋ฆฌ๊ณ  VSCode์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ด๊ณ  ํŒจํ‚ค์ง€ ๋ณต์›์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๊ณ„์†ํ•ด์„œ ์‹œ๋„ํ•ด ๋ณด์‹ญ์‹œ์˜ค.)

ํŒจํ‚ค์ง€ ๋ณต์›์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์ด ๋‹ค์Œ dotnet build ๋˜๋Š” dotnet publish ์™€ ๋‹ค๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ์— ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ช…๋ น์€ ํŒจํ‚ค์ง€๋ฅผ ๋ณต์›๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜์ด ์™„์ „ํžˆ ์‹คํŒจํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” dotnet publish ๋ฐ dotnet build ๋ชจ๋‘ dotnet restore ๋ฅผ ์•”์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ณต์›๋˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™•์ธํ•˜๊ณ  ์ฆ‰์„์—์„œ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ์ด๊ฒƒ์„ ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋‹น์‹ ์ด ํ•˜์ง€ ์•Š๋Š” --no-restore ํ”Œ๋ž˜๊ทธ๋ฅผ ๋Šฅ๋™์ ์œผ๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

@rjgotten ,
๊ท€ํ•˜์˜ ๋‹ต๋ณ€๊ณผ ์„ค๋ช…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ ๋ชจ๋“  nuget ํŒจํ‚ค์ง€๋Š” '๋นŒ๋“œ' ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์˜ global-packages ํด๋”์— ์บ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” /root/.nuget/packages/ ํด๋”์ด๊ณ  obj ํด๋”์—๋Š” ์ด ์ „์—ญ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์žˆ๋Š” ์ž‘์€ ํŒŒ์ผ๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ €์žฅ์†Œ ๋‚ญ๋น„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(๋ง์”€ํ•˜์‹  ๋Œ€๋กœ).
๋ชจ๋“  ๋„ˆ๊ฒŸ์ด ์ปจํ…Œ์ด๋„ˆ์— ์บ์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒŒ์‹œ ์ค‘ ๋‘ ๋ฒˆ์งธ ๋ณต์›์ด ์ตœ์†Œ x10๋ฐฐ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค(์ œ ๊ฒฝ์šฐ).

@zatuliveter @rjgotten ๋งˆ์ง€๋ง‰์— ์ •๋ณด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ œ๊ณตํ•œ ์˜ˆ์ œ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ dockerfile ๋น„ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Bash๋Š” ํ™•์‹คํžˆ ๋‚ด ๊ฐ•๋ ฅํ•œ ์ŠˆํŠธ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋‚˜์—๊ฒŒ ์‰ฝ๊ฒŒ ๊ฐ€์‹ญ์‹œ์˜ค! ์šฐ๋ฆฌ์˜ ๊ตฌ์กฐ๋Š” ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด Project/Project.csproj ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋“  proj ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๋กœ ์ด๋™ํ•œ ๋‹ค์Œ ๋ณต์›/๋ชจ๋‘ ๋ณต์‚ฌ/๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /src
COPY ./*/*.csproj ./proj/
RUN for file in $(ls ./proj); do mkdir /src/${file%.*} && mv ./proj/${file} /src/${file%.*}/${file}; done
RUN dotnet restore "MyProject/MyProject.csproj"
COPY . .
WORKDIR "/src/MyProject"
RUN dotnet publish "MyProject.csproj" -c Release -o /app --no-restore
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰