๋ฌธ์ ์ ๋ํ ์ค๋ช
:
$ 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
์์ ๊ฒฐ๊ณผ
๊ฒฐ๊ณผ ์ด๋ฏธ์ง๋ ์ปจํ
์คํธ์ ๋์ผํ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
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๋ฅผ ๋ฐ์ ์ ์์ต๋๊น?
๋ณ์ผ ์๋๋ค...
์์์...
๋ณต์ฌ .
์ฌ์ค, ๋ฐ๋์ ๋์ ์ฐ๊ธฐ๋ฅผ ๋ด๊ณ ์ฌ๊ธฐ๊น์ง ์จ ํ์๋ ๋ ์ด์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ํ์ ํ๋ :)
๊ฑด์ค์ ์ผ๋ก ํ์,
์ _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
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ก์ด ์ปค๋งจ๋ CP๋ฅผ ๋ง๋ค์ด ์ด๋ฒ์๋ ์ ๋๋ก ํด์ฃผ์ธ์.