Dockerfile Best Practice
์ด ๋ฌธ์๋ Dockerfile ๊ด๋ จํ์ฌ Best Practice์ ๋ํ ๋ด์ฉ์ ๊ณต๋ถ๋ ํ ๊ฒธ ๋ฒ์ญํ์๋ค.
์๋ณธ : https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
Dockerfile ์์ฑ ๋ชจ๋ฒ ์ฌ๋ก
์ด ๋ฌธ์์์๋ ํจ์จ์ ์ธ ์ด๋ฏธ์ง๋ฅผ ๊ตฌ์ถํ๊ธฐ์ํ ๊ถ์ฅ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
Docker๋ ์ฃผ์ด์ง ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๋ช
๋ น์ด ์์๋๋ก ํฌํจ ๋ ํ
์คํธ ํ์ผ ์ธ Dockerfile
์์ ์ง์นจ์ ์ฝ์ด ์ด๋ฏธ์ง๋ฅผ ์๋์ผ๋ก ๋น๋ํฉ๋๋ค. Dockerfile
์ Dockerfile ์ฐธ์กฐ์์ ์ฐพ์ ์ ์๋ ํน์ ํ์ ๋ฐ ์ง์นจ ์งํฉ์ ์ค์ํฉ๋๋ค.
Docker ์ด๋ฏธ์ง๋ ๊ฐ๊ฐ Dockerfile ๋ช ๋ น์ด๋ฅผ ๋ํ๋ด๋ ์ฝ๊ธฐ ์ ์ฉ ๋ ์ด์ด๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๋ ์ด์ด๋ ์ฐจ๋ก๋ก ์์ฌ ์๊ณ ๊ฐ ๋ ์ด์ด๋ ์ด์ ๋ ์ด์ด์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ๋ถ๋ถ์ ๋๋ค.
์๋ Dockerfile
์ ์ฐธ๊ณ ํ์ญ์์ค.
FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
๊ฐ ๋ช ๋ น์ด๋ ํ๋์ ๋ ์ด์ด๋ฅผ ๋ง๋ญ๋๋ค.
FROM
์ubuntu : 18.04
Docker ์ด๋ฏธ์ง์์ ๋ ์ด์ด๋ฅผ ์์ฑํฉ๋๋ค.COPY
๋ Docker ํด๋ผ์ด์ธํธ์ ํ์ฌ ๋๋ ํ ๋ฆฌ์์ ํ์ผ์ ์ถ๊ฐํฉ๋๋ค.RUN
์make
๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํฉ๋๋ค.CMD
๋ ์ปจํ ์ด๋ ๋ด์์ ์คํํ ๋ช ๋ น์ ์ง์ ํฉ๋๋ค.
์ด๋ฏธ์ง๋ฅผ ์คํํ๊ณ ์ปจํ ์ด๋๋ฅผ ์์ฑ ํ ๋ ๊ธฐ๋ณธ ๋ ์ด์ด ์์ ์ ์ฐ๊ธฐ ๊ฐ๋ฅํ ๊ณ์ธต("์ปจํ ์ด๋ ๋ ์ด์ด")๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ ํ์ผ ์ฐ๊ธฐ, ๊ธฐ์กด ํ์ผ ์์ ๋ฐ ํ์ผ ์ญ์ ์ ๊ฐ์ด ์คํ์ค์ธ ์ปจํ ์ด๋์ ๋ํ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ด ์ฐ๊ธฐ ๊ฐ๋ฅํ ์ปจํ ์ด๋ ๊ณ์ธต์ ๊ธฐ๋ก๋ฉ๋๋ค.
์ด๋ฏธ์ง ๋ ์ด์ด(๋ฐ Docker๊ฐ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ์ ์ฅํ๋ ๋ฐฉ๋ฒ)์ ๋ํ ์์ธํ ๋ด์ฉ์ ์คํ ๋ฆฌ์ง ๋๋ผ์ด๋ฒ ์ ๋ณด๋ฅผ ์ฐธ์กฐํ์ธ์.
์ผ๋ฐ ์ง์นจ ๋ฐ ๊ถ์ฅ ์ฌํญ
์์ ์ปจํ
์ด๋ ๋ง๋ค๊ธฐ
Dockerfile
์์ ์ ์ํ ์ด๋ฏธ์ง๋ ๊ฐ๋ฅํ ํ ์์์ ์ธ ์ปจํ
์ด๋๋ฅผ ์์ฑํด์ผํฉ๋๋ค. "์ผ์์ "์ด๋ ์ปจํ
์ด๋๋ฅผ ์ค์งํ๊ณ ํ๊ธฐ ํ ๋ค์ ๋ค์ ๋น๋ํ๊ณ ์ ๋ ์ต์ ์ค์ ๋ฐ ๊ตฌ์ฑ์ผ๋ก ๊ต์ฒด ํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
์ด๋ฌํ ์ํ ๋น ์ ์ฅ ๋ฐฉ์์ผ๋ก ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ๋๊ธฐ์ ๋ํด ์์ ๋ณด๋ ค๋ฉด "The Twelve-factor App" ๋ฐฉ๋ฒ๋ก ์ ํ๋ก์ธ์ค๋ฅผ ์ฐธ์กฐํ์ธ์.
๋น๋ ์ปจํ
์คํธ ์ดํด
docker build
๋ช
๋ น์ ์คํํ๋ฉด ํ์ฌ ์์
๋๋ ํ ๋ฆฌ๋ฅผ ๋น๋ ์ปจํ
์คํธ ๋ผ๊ณ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Dockerfile์ ์ด๊ณณ์ ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ง๋ง ํ์ผ ํ๋๊ทธ (-f
)๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์์น๋ฅผ ์ง์ ํ ์๋ ์์ต๋๋ค. Dockerfile
์ด ์ค์ ๋ก ์ด๋์ ์๋ ๊ด๊ณ์์ด ํ์ฌ ๋๋ ํฐ๋ฆฌ์ ์๋ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ์ ๋ชจ๋ ํ์ ์ฝํ
์ธ ๋ ๋น๋ ์ปจํ
์คํธ๋ก Docker ๋ฐ๋ชฌ์ ์ ์ก๋ฉ๋๋ค.
๋น๋ ์ปจํ ์คํธ ์์
๋น๋ ์ปจํ ์คํธ์ ๋ํ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์
cd
๋ก ๋ค์ด๊ฐ๋๋ค. 'hello'๋ผ๋ ํ ์คํธ ํ์ผ์ "hello"๋ฅผ ์ฐ๊ณ 'cat'์ ์คํํ๋ Dockerfile์ ๋ง๋ญ๋๋ค. ๋น๋ ์ปจํ ์คํธ (.
) ๋ด์์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํฉ๋๋ค.mkdir myproject && cd myproject echo "hello" > hello echo -e "FROM busybox\nCOPY /hello /\nRUN cat /hello" > Dockerfile docker build -t helloapp:v1 .
Dockerfile
๊ณผhello
๋ฅผ ๋ณ๋์ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํ๊ณ ์ด๋ฏธ์ง์ ๋ ๋ฒ์งธ ๋ฒ์ ์ ๋น๋ํฉ๋๋ค (๋ง์ง๋ง ๋น๋์ ์บ์์ ์์กดํ์ง ์์).-f
๋ฅผ ์ฌ์ฉํ์ฌ Dockerfile์ ๊ฐ๋ฆฌํค๊ณ ๋น๋ ์ปจํ ์คํธ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํฉ๋๋ค.mkdir -p dockerfiles context mv Dockerfile dockerfiles && mv hello context docker build --no-cache -t helloapp:v2 -f dockerfiles/Dockerfile context
์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ ๋ฐ ํ์ํ์ง ์์ ํ์ผ์ ์ค์๋ก ํฌํจํ๋ฉด ๋น๋ ์ปจํ
์คํธ์ ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ์ปค์ง๋๋ค. ์ด๋ ๊ฒํ๋ฉด ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ ์๊ฐ, ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๊ณ ํธ์ํ๋ ์๊ฐ, ์ปจํ
์ด๋ ๋ฐํ์ ํฌ๊ธฐ๊ฐ ๋์ด๋ ์ ์์ต๋๋ค. ๋น๋ ์ปจํ
์คํธ์ ํฌ๊ธฐ๋ฅผ ํ์ธํ๋ ค๋ฉด Dockerfile
์ ๋น๋ ํ ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ฐพ์ผ์ญ์์ค.
Sending build context to Docker daemon 187.8MB
stdin
์ ํตํด Dockerfile ํ์ดํ
stdin
์ ํตํด Dockerfile ํ์ดํDocker๋ ๋ก์ปฌ ๋๋ ์๊ฒฉ ๋น๋ ์ปจํ
์คํธ๋ฅผ ์ฌ์ฉํ์ฌstdin
์ ํตํดDockerfile
์ ํ์ดํํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋น๋ ํ ์ ์์ต๋๋ค. stdin
์ ํตํด Dockerfile
์ ํ์ดํํ๋ ๊ฒ์ Dockerfile์ ๋์คํฌ์ ์ฐ์ง ์๊ณ ์ผํ์ฑ ๋น๋๋ฅผ ์ํํ๋ ๋ฐ ์ ์ฉ ํ ์ ์์ต๋๋ค. ๋๋ Dockerfile
์ด ์์ฑ๋๋๋ผ๋ ์ดํ์ ์ง์๋์ง ์์์ผํฉ๋๋ค.
์ด ์น์ ์ ์์ ์์๋ ํธ์์ ์ด ๋ฌธ์๋ฅผ ์ฌ์ฉํ์ง๋ง
stdin
์Dockerfile
์ ์ ๊ณตํ๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. .์๋ฅผ ๋ค์ด ๋ค์ ๋ช ๋ น์ ๋์ผํฉ๋๋ค.
echo -e 'FROM busybox\nRUN echo "hello world"' | docker build -
docker build -<<EOF FROM busybox RUN echo "hello world" EOF
์์ ๋ฅผ ์ ํธํ๋ ์ ๊ทผ ๋ฐฉ์ ๋๋ ์ฌ์ฉ ์ฌ๋ก์ ๊ฐ์ฅ ์ ํฉํ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ๋์ฒด ํ ์ ์์ต๋๋ค.
๋น๋ ์ปจํ ์คํธ๋ฅผ ๋ณด๋ด์ง ์๊ณ STDIN์์ DOCKERFILE์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ๋น๋
๋น๋ ์ปจํ
์คํธ๋ก ์ถ๊ฐ ํ์ผ์ ๋ณด๋ด์ง ์๊ณ stdin
์ Dockerfile
์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ ค๋ฉด ์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ญ์์ค. ํ์ดํ(-
)์ PATH
์ ์์น๋ฅผ ์ทจํ๊ณ Docker๊ฐ ๋๋ ํ ๋ฆฌ ๋์ stdin
์์ ๋น๋ ์ปจํ
์คํธ (Dockerfile
๋ง ํฌํจ)๋ฅผ ์ฝ๋๋ก ์ง์ํฉ๋๋ค.
docker build [OPTIONS] -
๋ค์ ์์ ๋ stdin
์ ํตํด ์ ๋ฌ๋๋ Dockerfile
์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํฉ๋๋ค. ๋ฐ๋ชฌ์ ๋น๋ ์ปจํ
์คํธ๋ก ํ์ผ์ด ์ ์ก๋์ง ์์ต๋๋ค.
docker build -t myimage:latest -<<EOF
FROM busybox
RUN echo "hello world"
EOF
๋น๋ ์ปจํ
์คํธ๋ฅผ ์๋ตํ๋ฉด Dockerfile
์ด ํ์ผ์ ์ด๋ฏธ์ง์ ๋ณต์ฌ ํ ํ์๊ฐ์๋ ์ํฉ์์ ์ ์ฉ ํ ์ ์์ผ๋ฉฐ ๋ฐ๋ชฌ์ ํ์ผ์ด ์ ์ก๋์ง ์์ผ๋ฏ๋ก ๋น๋ ์๋๊ฐ ํฅ์๋ฉ๋๋ค.
๋น๋ ์ปจํ ์คํธ์์ someํ์ผ์ ์ ์ธํ์ฌ ๋น๋ ์๋๋ฅผ ๋์ด๋ ค๋ฉด exclude with .dockerignore๋ฅผ ์ฐธ์กฐํ์ธ์.
Note: ์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด
COPY
๋๋ADD
๋ฅผ ์ฌ์ฉํ๋ Dockerfile ๋น๋ ์๋๊ฐ ์คํจํฉ๋๋ค. ๋ค์ ์๋ ์ด๋ฅผ ์ค๋ช ํฉ๋๋ค.# create a directory to work in mkdir example cd example # create an example file touch somefile.txt docker build -t myimage:latest -<<EOF FROM busybox COPY somefile.txt . RUN cat /somefile.txt EOF # observe that the build fails ... Step 2/3 : COPY somefile.txt . COPY failed: stat /var/lib/docker/tmp/docker-builder249218248/somefile.txt: no such file or directory
stdin์ Dockerfile์ ์ฌ์ฉํ์ฌ ๋ก์ปฌ ๋น๋ ์ปจํ ์คํธ์์ ๋น๋
์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ก์ปฌ ํ์ผ ์์คํ
์ ํ์ผ์ ์ฌ์ฉํ์ง๋ง stdin
์ Dockerfile
์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํฉ๋๋ค. ๊ตฌ๋ฌธ์ -f
(๋๋ --file
) ์ต์
์ ์ฌ์ฉํ์ฌ ์ฌ์ฉํ Dockerfile
์ ์ง์ ํ๊ณ , ํ์ดํ(-
)์ ํ์ผ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ์ฌ Docker๊ฐ stdin
์์ Dockerfile
์ ์ฝ๋๋ก ์ง์ํฉ๋๋ค.
docker build [OPTIONS] -f- PATH
์๋ ์์ ๋ ํ์ฌ ๋๋ ํ ๋ฆฌ (.
)๋ฅผ ๋น๋ ์ปจํ
์คํธ๋ก ์ฌ์ฉํ๊ณ ์ด ๋ฌธ์๋ฅผ ์ฌ์ฉํ์ฌ stdin
์ ํตํด ์ ๋ฌ๋๋ Dockerfile
์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํฉ๋๋ค.
# create a directory to work in
mkdir example
cd example
# create an example file
touch somefile.txt
# build an image using the current directory as context, and a Dockerfile passed through stdin
docker build -t myimage:latest -f- . <<EOF
FROM busybox
COPY somefile.txt .
RUN cat /somefile.txt
EOF
stdin์ Dockerfile์ ์ฌ์ฉํ์ฌ ์๊ฒฉ ๋น๋ ์ปจํ ์คํธ์์ ๋น๋
์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ stdin
์ Dockerfile
์ ์ฌ์ฉํ์ฌ ์๊ฒฉ git
์ ์ฅ์์ ํ์ผ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํฉ๋๋ค. ๊ตฌ๋ฌธ์ -f
(๋๋ --file
) ์ต์
์ ์ฌ์ฉํ์ฌ ์ฌ์ฉํ Dockerfile
์ ์ง์ ํ๊ณ , ํ์ดํ(-
)์ ํ์ผ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ์ฌ Docker๊ฐ stdin
์์ Dockerfile
์ ์ฝ๋๋ก ์ง์ํฉ๋๋ค.
docker build [OPTIONS] -f- PATH
์ด ๊ตฌ๋ฌธ์ Dockerfile
์ด ํฌํจ๋์ง ์์ ์ ์ฅ์์์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ ค๋ ๊ฒฝ์ฐ ๋๋ ์ ์ฅ์์ ์์ฒด ํฌํฌ๋ฅผ ์ ์งํ์ง ์๊ณ ์ฌ์ฉ์ ์ ์ Dockerfile
๋ก ๋น๋ํ๋ ค๋ ๊ฒฝ์ฐ์ ์ ์ฉ ํ ์ ์์ต๋๋ค.
์๋ ์์ ๋ stdin
์ Dockerfile
์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ GitHub์ "hello-world" Git ์ ์ฅ์์์ hello.c
ํ์ผ์ ์ถ๊ฐํฉ๋๋ค.
docker build -t myimage:latest -f- https://github.com/docker-library/hello-world.git <<EOF
FROM busybox
COPY hello.c .
EOF
์์ธ ๋ด์ฉ
์๊ฒฉ Git ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋น๋ ์ปจํ ์คํธ๋ก ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋น๋ ํ ๋ Docker๋ ๋ก์ปฌ ๋จธ์ ์์ ๋ฆฌํฌ์งํ ๋ฆฌ์
git clone
์ ์ํํ๊ณ ํด๋น ํ์ผ์ ๋น๋ ์ปจํ ์คํธ๋ก ๋ฐ๋ชฌ์ ๋ณด๋ ๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉดdocker build
๋ช ๋ น์ ์คํํ๋ ํธ์คํธ์git
์ด ์ค์น๋์ด ์์ด์ผํฉ๋๋ค.
.dockerignore๋ก ์ ์ธ
์์ค ์ ์ฅ์๋ฅผ ์ฌ๊ตฌ์ฑํ์ง ์๊ณ ๋น๋์ ๊ด๋ จ์ด์๋ ํ์ผ์ ์ ์ธํ๋ ค๋ฉด .dockerignore
ํ์ผ์ ์ฌ์ฉํ์ญ์์ค. ์ด ํ์ผ์ .gitignore
ํ์ผ๊ณผ ์ ์ฌํ ์ ์ธ ํจํด์ ์ง์ํฉ๋๋ค. ์์ฑ์ ๋ํ ์ ๋ณด๋ .dockerignore ํ์ผ์ ์ฐธ์กฐํ์ญ์์ค.
๋ค๋จ๊ณ ๋น๋ ์ฌ์ฉ
๋ค๋จ๊ณ ๋น๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๊ฐ ๋ ์ด์ด ๋ฐ ํ์ผ ์๋ฅผ ์ค์ด๊ธฐ ์ํด ๊ณ ๋ฏผํ์ง ์๊ณ ์ต์ข ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ๋ํญ ์ค์ผ ์ ์์ต๋๋ค.
์ด๋ฏธ์ง๋ ๋น๋ ํ๋ก์ธ์ค์ ๋ง์ง๋ง ๋จ๊ณ์์ ๋น๋๋๋ฏ๋ก ๋น๋ ์บ์ ํ์ฉ์ ํตํด ์ด๋ฏธ์ง ๋ ์ด์ด๋ฅผ ์ต์ํ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋น๋์ ์ฌ๋ฌ ๋ ์ด์ด๊ฐ ํฌํจ ๋ ๊ฒฝ์ฐ ๋ณ๊ฒฝ ๋น๋๊ฐ ๋ฎ์ ๊ฒ (๋น๋ ์บ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ)์์ ๋ ์์ฃผ ๋ณ๊ฒฝ๋๋ ์์๋ก ์์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ํ์ํ ๋๊ตฌ ์ค์น
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ข ์์ฑ ์ค์น ๋๋ ์ ๋ฐ์ดํธ
์์ฉ ํ๋ก๊ทธ๋จ ์์ฑ
Go ์ ํ๋ฆฌ์ผ์ด์ ์ฉ Dockerfile์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
FROM golang:1.11-alpine AS build
# ํ๋ก์ ํธ์ ํ์ํ ๋๊ตฌ ์ค์น
# `docker build --no-cache .`๋ฅผ ์คํํ์ฌ ์ข
์์ฑ ์
๋ฐ์ดํธ
RUN apk add --no-cache git
RUN go get github.com/golang/dep/cmd/dep
# Gopkg.toml ๋ฐ Gopkg.lock์ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ ์ข
์์ฑ ๋์ด
# ์ด ๋ ์ด์ด๋ Gopkg ํ์ผ์ด ์
๋ฐ์ดํธ ๋ ๋๋ง ๋ค์ ๋น๋๋ฉ๋๋ค.
COPY Gopkg.lock Gopkg.toml /go/src/project/
WORKDIR /go/src/project/
# ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ ์ค์น
RUN dep ensure -vendor-only
# ์ ์ฒด ํ๋ก์ ํธ๋ฅผ ๋ณต์ฌํ๊ณ ๋น๋
# ์ด ๋ ์ด์ด๋ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์์ ํ์ผ์ด ๋ณ๊ฒฝ ๋ ๋ ๋ค์ ์์ฑ๋ฉ๋๋ค.
COPY . /go/src/project/
RUN go build -o /bin/project
# ๊ฒฐ๊ณผ์ ์ผ๋ก ๋จ์ผ ๋ ์ด์ด ์ด๋ฏธ์ง๊ฐ ์์ฑ๋ฉ๋๋ค.
FROM scratch
COPY --from=build /bin/project /bin/project
ENTRYPOINT ["/bin/project"]
CMD ["--help"]
๋ถํ์ํ ํจํค์ง๋ฅผ ์ค์นํ์ง ๋ง์ญ์์ค
๋ณต์ก์ฑ, ์ข ์์ฑ, ํ์ผ ํฌ๊ธฐ ๋ฐ ๋น๋ ์๊ฐ์ ์ค์ด๋ ค๋ฉด "์์ผ๋ฉด ์ข์ ๊ฒ" ์ด๋ผ๋ ์ด์ ๋ก ์ถ๊ฐ ๋๋ ๋ถํ์ํ ํจํค์ง๋ฅผ ์ค์นํ์ง ๋ง์ญ์์ค. ์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฏธ์ง์ ํ ์คํธ ํธ์ง๊ธฐ๋ฅผ ํฌํจ ํ ํ์๊ฐ ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์
๋ถ๋ฆฌ
๊ฐ ์ปจํ ์ด๋์๋ ํ๋์ ๊ด์ฌ์ฌ๊ฐ ์์ด์ผํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ์ปจํ ์ด๋๋ก ๋ถ๋ฆฌํ๋ฉด ๋ ์ฝ๊ฒ ์ํ์ผ๋ก ํ์ฅํ๊ณ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฌ์ฉ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ๋ถ๋ฆฌ ๋ ๋ฐฉ์์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ์ธ ๋ฉ๋ชจ๋ฆฌ ์บ์๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๊ฐ๊ฐ ๊ณ ์ ํ ์ด๋ฏธ์ง๊ฐ์๋ 3๊ฐ์ ๊ฐ๋ณ ์ปจํ ์ด๋๋ก ๊ตฌ์ฑ ๋ ์ ์์ต๋๋ค.
๊ฐ ์ปจํ ์ด๋๋ฅผ ํ๋์ ํ๋ก์ธ์ค๋ก ์ ํํ๋ ๊ฒ์ ์ข์ ๊ฒฝํ ๊ท์น์ด์ง๋ง ๊ฐ๋ ฅํ๊ณ ๋น ๋ฅธ ๊ท์น์ ์๋๋๋ค. ์๋ฅผ ๋ค์ด, ์ปจํ ์ด๋๋ ์ด๊ธฐํ ํ๋ก์ธ์ค๋ก ์์ฑ์ ํ ์ ์์ ๋ฟ๋ง ์๋๋ผ ์ผ๋ถ ํ๋ก๊ทธ๋จ์ ์์ฒด์ ์ผ๋ก ์ถ๊ฐ ํ๋ก์ธ์ค๋ฅผ ์์ฑ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Celery๋ ์ฌ๋ฌ ์์ ์ ํ๋ก์ธ์ค๋ฅผ ์์ฑ ํ ์ ์๊ณ Apache๋ ์์ฒญ ๋น ํ๋์ ํ๋ก์ธ์ค๋ฅผ ์์ฑ ํ ์ ์์ต๋๋ค.
์ปจํ ์ด๋๋ฅผ ๊ฐ๋ฅํ ํ ๊นจ๋ํ๊ณ ๋ชจ๋์์ผ๋ก ์ ์งํ๊ธฐ ์ํด ์ต์ ์ ํ๋จ์ ์ฌ์ฉํ์ญ์์ค. ์ปจํ ์ด๋๊ฐ ์๋ก ์์กด์ฑ์ด ์๋ ๊ฒฝ์ฐ Docker ์ปจํ ์ด๋ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ปจํ ์ด๋๊ฐ ํต์ ํ ์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๋ ์ด์ด ์ ์ต์ํ
์ด์ ๋ฒ์ ์ Docker์์๋ ์ฑ๋ฅ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ด๋ฏธ์ง์ ๋ ์ด์ด ์๋ฅผ ์ต์ํํ๋ ๊ฒ์ด ์ค์ํ์ต๋๋ค. ์ด ์ ํ์ ์ค์ด๊ธฐ ์ํด ๋ค์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค.
RUN
,COPY
,ADD
๋ช ๋ น์ด ๋ง ๋ ์ด์ด๋ฅผ ์์ฑํฉ๋๋ค. ๋ค๋ฅธ ์ง์นจ์ ์์ ์ค๊ฐ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ ๋น๋ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ์ง ์์ต๋๋ค.๊ฐ๋ฅํ๋ฉด [๋ค๋จ๊ณ ๋น๋] (multistage-build.md)๋ฅผ ์ฌ์ฉํ๊ณ ํ์ํ ์ํฐํฉํธ ๋ง ์ต์ข ์ด๋ฏธ์ง์ ๋ณต์ฌํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ต์ข ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ์ง ์๊ณ ๋ ์ค๊ฐ ๋น๋ ๋จ๊ณ์ ๋๊ตฌ ๋ฐ ๋๋ฒ๊ทธ ์ ๋ณด๋ฅผ ํฌํจ ํ ์ ์์ต๋๋ค.
์ฌ๋ฌ ์ค ์ธ์ ์ ๋ ฌ
๊ฐ๋ฅํ๋ฉด ์ฌ๋ฌ ์ค ์ธ์๋ฅผ ์์ซ์ ์์ผ๋ก ์ ๋ ฌํ์ฌ ๋์ค์ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒํ๋ฉด ํจํค์ง ์ค๋ณต์ ๋ฐฉ์งํ๊ณ ๋ชฉ๋ก์ ํจ์ฌ ์ฝ๊ฒ ์
๋ฐ์ดํธ ํ ์ ์์ต๋๋ค. ๋ํ PR์ ์ฝ๊ณ ๊ฒํ ํ๊ธฐ๊ฐ ํจ์ฌ ์ฌ์์ง๋๋ค. ๋ฐฑ ์ฌ๋์ (\
) ์์ ๊ณต๋ฐฑ์ ์ถ๊ฐํ๋ ๊ฒ๋ ๋์์ด๋ฉ๋๋ค.
๋ค์์ buildpack-deps
์ด๋ฏธ์ง์ ์์
๋๋ค.
RUN apt-get update && apt-get install -y \
bzr \
cvs \
git \
mercurial \
subversion
๋น๋ ์บ์ ํ์ฉ
์ด๋ฏธ์ง๋ฅผ ๋น๋ ํ ๋ Docker๋ Dockerfile
์ ์ง์นจ์ ๋จ๊ณ๋ณ๋ก ์ํํ์ฌ ์ง์ ๋ ์์๋๋ก ๊ฐ๊ฐ์ ์คํํฉ๋๋ค. ๊ฐ ๋ช
๋ น์ด๋ฅผ ๊ฒ์ฌ ํ ๋ Docker๋ ์(์ค๋ณต) ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ๋์ ์บ์์์ ์ฌ์ฌ์ฉ ํ ์ ์๋ ๊ธฐ์กด ์ด๋ฏธ์ง๋ฅผ ์ฐพ์ต๋๋ค.
์บ์๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์์ผ๋ ค๋ฉด docker build
๋ช
๋ น์ --no-cache = true
์ต์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Docker๊ฐ ์บ์๋ฅผ ์ฌ์ฉํ๋๋ก ํ์ฉํ๋ ๊ฒฝ์ฐ ์ผ์นํ๋ ์ด๋ฏธ์ง๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ์ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. Docker๊ฐ ๋ฐ๋ฅด๋ ๊ธฐ๋ณธ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๋ฏธ ์บ์์ ์๋ ์์ ์ด๋ฏธ์ง๋ก ์์ํ์ฌ ๋ค์ ๋ช ๋ น์ด๋ฅผ ํด๋น ๊ธฐ๋ณธ ์ด๋ฏธ์ง์์ ํ์ ๋ ๋ชจ๋ ํ์ ์ด๋ฏธ์ง์ ๋น๊ตํ์ฌ ๊ทธ ์ค ํ๋๊ฐ ์ ํํ ๋์ผํ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๋์๋์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์บ์๊ฐ ๋ฌดํจํ๋ฉ๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ
Dockerfile
์ ๋ช ๋ น์ด๋ฅผ ํ์ ์ด๋ฏธ์ง ์ค ํ๋์ ๋น๊ตํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํฉ๋๋ค. ๊ทธ๋ฌ๋ ํน์ ์ง์นจ์๋ ๋ ๋ง์ ๊ฒ์ฌ์ ์ค๋ช ์ด ํ์ํฉ๋๋ค.ADD
๋ฐCOPY
๋ช ๋ น์ ๊ฒฝ์ฐ ์ด๋ฏธ์ง์์๋ ํ์ผ์ ๋ด์ฉ์ ๊ฒ์ฌํ๊ณ ๊ฐ ํ์ผ์ ๋ํด ์ฒดํฌ์ฌ์ ๊ณ์ฐํฉ๋๋ค. ํ์ผ์ ๋ง์ง๋ง ์์ ๋ฐ ๋ง์ง๋ง ์ก์ธ์ค ์๊ฐ์์ด ์ฒดํฌ์ฌ์์ ๊ณ ๋ ค๋์ง ์์ต๋๋ค. ์บ์ ์กฐํ ์ค์ ์ฒดํฌ์ฌ์ ๊ธฐ์กด ์ด๋ฏธ์ง์ ์ฒดํฌ์ฌ๊ณผ ๋น๊ต๋ฉ๋๋ค. ๋ด์ฉ ๋ฐ ๋ฉํ ๋ฐ์ดํฐ์ ๊ฐ์ด ํ์ผ์์ ๋ณ๊ฒฝ๋ ์ฌํญ์ด ์์ผ๋ฉด ์บ์๊ฐ ๋ฌดํจํ๋ฉ๋๋ค.ADD
๋ฐCOPY
๋ช ๋ น์ ์ ์ธํ๊ณ ์บ์ ๊ฒ์ฌ๋ ์บ์ ์ผ์น๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ปจํ ์ด๋์ ํ์ผ์ ํ์ธํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ดRUN apt-get -y update
๋ช ๋ น์ ์ฒ๋ฆฌ ํ ๋ ์ปจํ ์ด๋์์ ์ ๋ฐ์ดํธ ๋ ํ์ผ์ ์บ์ ์ ์ค์ด ์กด์ฌํ๋์ง ํ์ธํ๊ธฐ ์ํด ๊ฒ์ฌ๋์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ช ๋ น ๋ฌธ์์ด ์์ฒด ๋ง ์ผ์น๋ฅผ ์ฐพ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์บ์๊ฐ ๋ฌดํจํ๋๋ฉด ๋ชจ๋ ํ์Dockerfile
๋ช ๋ น์ด ์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ณ ์บ์๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
Dockerfile ์ง์นจ
์ด๋ฌํ ๊ถ์ฅ ์ฌํญ์ ํจ์จ์ ์ด๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ Dockerfile
์ ๋ง๋๋ ๋ฐ ๋์์ด๋๋๋ก ์ค๊ณ๋์์ต๋๋ค.
FROM
FROM ๋ช ๋ น์ด์ ๋ํ Dockerfile ์ฐธ์กฐ
๊ฐ๋ฅํ๋ฉด ํ์ฌ ๊ณต์ ์ด๋ฏธ์ง๋ฅผ ์ด๋ฏธ์ง์ ๊ธฐ์ด๋ก ์ฌ์ฉํ์ธ์. Alpine ์ด๋ฏธ์ง๋ ์๊ฒฉํ๊ฒ ์ ์ด๋๊ณ ํฌ๊ธฐ๊ฐ ์์ผ๋ฉฐ (ํ์ฌ 5MB ๋ฏธ๋ง) ์ ์ฒด Linux ๋ฐฐํฌํ์ด๋ฏ๋ก ๊ถ์ฅํฉ๋๋ค.
LABEL
์ด๋ฏธ์ง์ ๋ ์ด๋ธ์ ์ถ๊ฐํ์ฌ ํ๋ก์ ํธ๋ณ๋ก ์ด๋ฏธ์ง๋ฅผ ๊ตฌ์ฑํ๊ณ , ๋ผ์ด์ผ์ฑ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๊ณ , ์๋ํ๋ฅผ ์ง์ํ๊ฑฐ๋ ๊ธฐํ ๋ค๋ฅธ ์ด์ ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ ๋ผ๋ฒจ์ LABEL
๋ก ์์ํ๊ณ ํ๋ ์ด์์ ํค-๊ฐ ์์ผ๋ก ์์ํ๋ ์ค์ ์ถ๊ฐํฉ๋๋ค.
๋ค์ ์๋ ๋ค์ํ ํ์ฉ ํ์์ ๋ณด์ฌ์ค๋๋ค. ์ค๋ช
์ฃผ์์ด ์ธ๋ผ์ธ์ผ๋ก ํฌํจ๋ฉ๋๋ค.
๊ณต๋ฐฑ์ด์๋ ๋ฌธ์์ด์ ๋ฐ์ดํ๋ก ๋ฌถ๊ฑฐ๋ or ๊ณต๋ฐฑ์ ์ด์ค์ผ์ดํ ํด์ผํฉ๋๋ค. ๋ด๋ถ ๋ฐ์ดํ (
"
)๋ ์ด์ค์ผ์ดํํด์ผํฉ๋๋ค.
# ํ๋ ์ด์์ ๊ฐ๋ณ ๋ ์ด๋ธ ์ค์
LABEL com.example.version="0.0.1-beta"
LABEL vendor1="ACME Incorporated"
LABEL vendor2=ZENITH\ Incorporated
LABEL com.example.release-date="2015-02-12"
LABEL com.example.version.is-production=""
์ด๋ฏธ์ง์๋ ๋ ์ด์์ ๋ ์ด๋ธ์ด์์ ์ ์์ต๋๋ค. Docker 1.10 ์ด์ ์๋ ์ถ๊ฐ ๋ ์ด์ด๊ฐ ์์ฑ๋์ง ์๋๋ก ๋ชจ๋ ๋ผ๋ฒจ์ ๋จ์ผ LABEL
๋ช
๋ น์ด๋ก ๊ฒฐํฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ ์ด์ ํ์ํ์ง ์์ง๋ง ๋ ์ด๋ธ ๊ฒฐํฉ์ ๊ณ์ ์ง์๋ฉ๋๋ค.
# ํ ์ค์ ์ฌ๋ฌ ๋ ์ด๋ธ ์ค์
LABEL com.example.version="0.0.1-beta" com.example.release-date="2015-02-12"
์์ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์๋ ์์ต๋๋ค.
# ๊ธด ์ค์ ๋๊ธฐ ์ํด ์ค ์ฐ์ ๋ฌธ์๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋ฒ์ ์ฌ๋ฌ ๋ ์ด๋ธ ์ค์
LABEL vendor=ACME\ Incorporated \
com.example.is-beta= \
com.example.is-production="" \
com.example.version="0.0.1-beta" \
com.example.release-date="2015-02-12"
ํ์ฉ๋๋ ๋ ์ด๋ธ ํค ๋ฐ ๊ฐ์ ๋ํ ์ง์นจ์ ๊ฐ์ฒด ๋ ์ด๋ธ ์ดํด๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ๋ ์ด๋ธ ์ฟผ๋ฆฌ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๊ฐ์ฒด ๋ ์ด๋ธ ๊ด๋ฆฌ์ ํํฐ๋ง ๊ด๋ จ ํญ๋ชฉ์ ์ฐธ์กฐํ์ญ์์ค. Dockerfile ์ฐธ์กฐ์ LABEL๋ ์ฐธ์กฐํ์ธ์.
RUN
RUN ๋ช ๋ น์ด์ ๋ํ Dockerfile ์ฐธ์กฐ
๊ธธ๊ฑฐ๋ ๋ณต์กํ RUN
๋ฌธ์ ๋ฐฑ ์ฌ๋์๋ก ๊ตฌ๋ถ๋ ์ฌ๋ฌ ์ค๋ก ๋ถํ ํ์ฌ Dockerfile
์ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
apt-get
์๋ง๋ RUN
์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ apt-get
์ ์ ํ๋ฆฌ์ผ์ด์
์ผ ๊ฒ์
๋๋ค. ํจํค์ง๋ฅผ ์ค์นํ๊ธฐ ๋๋ฌธ์ RUN apt-get
๋ช
๋ น์๋ ์ฃผ์ํด์ผ ํ ๋ช๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์์ ์ด๋ฏธ์ง์ ๋ง์ "ํ์"ํจํค์ง๊ฐ ๋น ๊ถํ ์ปจํ
์ด๋ ๋ด์์ ์
๊ทธ๋ ์ด๋ ํ ์ ์์ผ๋ฏ๋ก RUN apt-get upgrade
๋ฐ dist-upgrade
๋ฅผ ํผํ์ญ์์ค.
๋ถ๋ชจ ์ด๋ฏธ์ง์ ํฌํจ ๋ ํจํค์ง๊ฐ ์ค๋๋ ๊ฒฝ์ฐ ํด๋น ๊ด๋ฆฌ์์๊ฒ ๋ฌธ์ํ์ญ์์ค.
์
๋ฐ์ดํธํด์ผํ๋ ํน์ ํจํค์ง foo
๊ฐ์๋ ๊ฒฝ์ฐ apt-get install -y foo
๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ์
๋ฐ์ดํธํฉ๋๋ค.
ํญ์ ๋์ผํ RUN
๋ฌธ์์ RUN apt-get update
์ apt-get install
์ ๊ฒฐํฉํ์ญ์์ค. ์๋ฅผ ๋ค๋ฉด :
RUN apt-get update && apt-get install -y \
package-bar \
package-baz \
package-foo
RUN
๋ฌธ์์ apt-get update
๋ง ์ฌ์ฉํ๋ฉด ์บ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ํ์ apt-get install
๋ช
๋ น์ด ์คํจํฉ๋๋ค.
์๋ฅผ ๋ค์ด Dockerfile์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install -y curl
์ด๋ฏธ์ง๋ฅผ ๋น๋ ํ ํ ๋ชจ๋ ๋ ์ด์ด๋ Docker ์บ์์ ์์ต๋๋ค.
๋์ค์ ์ถ๊ฐ ํจํค์ง๋ฅผ ์ถ๊ฐํ์ฌ apt-get install
์ ์์ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install -y curl nginx
Docker๋ ์ด๊ธฐ ๋ฐ ์์ ๋ ์ง์นจ์ ๋์ผํ๊ฒ๋ณด๊ณ ์ด์ ๋จ๊ณ์ ์บ์๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋น๋๊ฐ ์บ์ ๋ ๋ฒ์ ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ apt-get update
๊ฐ ์คํ๋์ง ์์ต๋๋ค.
apt-get update
๊ฐ ์คํ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋น๋๊ฐ ์ ์ฌ์ ์ผ๋ก curl
๋ฐ nginx
ํจํค์ง์ ์ค๋๋ ๋ฒ์ ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
RUN apt-get update && apt-get install -y
๋ฅผ ์ฌ์ฉํ๋ฉด Dockerfile์ด ์ถ๊ฐ ์ฝ๋ฉ์ด๋ ์๋ ๊ฐ์
์์ด ์ต์ ํจํค์ง ๋ฒ์ ์ ์ค์นํ ์ ์์ต๋๋ค. ์ด ๊ธฐ์ ์ "์บ์ ๋ฌดํจํ" ๋ผ๊ณ ํฉ๋๋ค.
ํจํค์ง ๋ฒ์ ์ ์ง์ ํ์ฌ ์บ์ ๋ฌดํจํ๋ฅผ ์ํ ํ ์๋ ์์ต๋๋ค.
์ด๋ฅผ ๋ฒ์ ๊ณ ์ ์ด๋ผ๊ณ ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
RUN apt-get update && apt-get install -y \
package-bar \
package-baz \
package-foo=1.3.*
๋ฒ์ ๊ณ ์ ์ ์บ์์์๋ ํญ๋ชฉ์ ๊ด๊ณ์์ด ๋น๋๊ฐ ํน์ ๋ฒ์ ์ ๊ฒ์ํ๋๋ก ํฉ๋๋ค. ์ด ๊ธฐ์ ์ ๋ํ ํ์ ํจํค์ง์ ์์์น ๋ชปํ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ์คํจ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
๋ค์์ ๋ชจ๋ apt-get
๊ถ์ฅ ์ฌํญ์ ๋ณด์ฌ์ฃผ๋ ์ ๊ตฌ์ฑ๋ RUN
๋ช
๋ น์ด์
๋๋ค.
RUN apt-get update && apt-get install -y \
aufs-tools \
automake \
build-essential \
curl \
dpkg-sig \
libcap-dev \
libsqlite3-dev \
mercurial \
reprepro \
ruby1.9.1 \
ruby1.9.1-dev \
s3cmd=1.1.* \
&& rm -rf /var/lib/apt/lists/*
s3cmd
์ธ์๋ 1.1. *
๋ฒ์ ์ ์ง์ ํฉ๋๋ค. ์ด๋ฏธ์ง๊ฐ ์ด์ ์ ์ค๋๋ ๋ฒ์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ ๋ฒ์ ์ ์ง์ ํ๋ฉด apt-get update
์บ์ ๋ฒ์คํธ๊ฐ ๋ฐ์ํ๊ณ ์ ๋ฒ์ ์ด ์ค์น๋ฉ๋๋ค.
๊ฐ ์ค์ ํจํค์ง๋ฅผ ๋์ดํ๋ฉด ํจํค์ง ๋ณต์ ์ค์๋ฅผ ๋ฐฉ์ง ํ ์ ์์ต๋๋ค.
๋ํ /var/lib/apt/lists
๋ฅผ ์ ๊ฑฐํ์ฌ apt ์บ์๋ฅผ ์ ๋ฆฌํ๋ฉด apt ์บ์๊ฐ ๋ ์ด์ด์ ์ ์ฅ๋์ง ์์ผ๋ฏ๋ก ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ์ค์ด ๋ญ๋๋ค.
RUN
๊ตฌ๋ฌธ์ apt-get update
๋ก ์์ํ๋ฏ๋ก ํจํค์ง ์บ์๋ ํญ์ apt-get install
์ ์ ์๋ก ๊ณ ์ณ์ง๋๋ค.
๊ณต์ Debian ๋ฐ Ubuntu ์ด๋ฏธ์ง
apt-get clean
์๋ ์คํ์ด๋ฏ๋ก ๋ช ์ ์ ์ผ๋ก ํธ์ถ ํ ํ์๊ฐ ์์ต๋๋ค.
ํ์ดํ ์ฌ์ฉ
์ผ๋ถ RUN
๋ช
๋ น์ ๋ค์ ์์ ๊ฐ์ด ํ์ดํ ๋ฌธ์ (|
)๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋ช
๋ น์ ์ถ๋ ฅ์ ๋ค๋ฅธ ๋ช
๋ น์ผ๋ก ํ์ดํํ๋ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค.
RUN wget -O - https://some.site | wc -l > /number
Docker๋ ํ์ดํ์์ ๋ง์ง๋ง ์์
์ ์ข
๋ฃ ์ฝ๋๋ง ํ๊ฐํ์ฌ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ํ์ธํ๋ /bin/sh -c
์ธํฐํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๋ช
๋ น์ ์คํํฉ๋๋ค. ์์ ์์ ์์ ์ด ๋น๋ ๋จ๊ณ๋ wget
๋ช
๋ น์ด ์คํจํ๋๋ผ๋ wc -l
๋ช
๋ น์ด ์ฑ๊ณตํ๋ ํ ์ฑ๊ณตํ๊ณ ์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํฉ๋๋ค.
ํ์ดํ์ ์ด๋ ๋จ๊ณ์์๋ ์ค๋ฅ๋ก ์ธํด ๋ช
๋ น์ด ์คํจํ๋๋กํ๋ ค๋ฉด set -o pipefail &&
๋ฅผ ์์ ์ถ๊ฐํ์ฌ ์๊ธฐ์น ์์ ์ค๋ฅ๋ก ์ธํด ๋น๋๊ฐ ์ค์๋ก ์ฑ๊ณตํ์ง ๋ชปํ๋๋ก ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด :
RUN set -o pipefail && wget -O - https://some.site | wc -l > /number
๋ชจ๋ ์์ด
-o pipefail
์ต์ ์ ์ง์ํ๋ ๊ฒ์ ์๋๋๋ค.Debian ๊ธฐ๋ฐ ์ด๋ฏธ์ง์
dash
์๊ณผ ๊ฐ์ ๊ฒฝ์ฐRUN
์ ์คํ ํ์์ ์ฌ์ฉํ์ฌpipefail
์ต์ ์ ์ง์ํ๋ ์์ ๋ช ์ ์ ์ผ๋ก ์ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด :RUN ["/bin/bash", "-c", "set -o pipefail && wget -O - https://some.site | wc -l > /number"]
CMD
CMD ๋ช ๋ น์ ๋ํ Dockerfile ์ฐธ์กฐ
CMD
๋ช
๋ น์ ์ธ์์ ํจ๊ป ์ด๋ฏธ์ง์ ํฌํจ ๋ ์ํํธ์จ์ด๋ฅผ ์คํํ๋ ๋ฐ ์ฌ์ฉํด์ผํฉ๋๋ค.
CMD
๋ ๊ฑฐ์ ํญ์ CMD ["executable", "param1", "param2"โฆ]
ํ์์ผ๋ก ์ฌ์ฉ๋์ด์ผํฉ๋๋ค.
๋ฐ๋ผ์ ์ด๋ฏธ์ง๊ฐ Apache ๋ฐ Rails์ ๊ฐ์ ์๋น์ค ์ฉ์ธ ๊ฒฝ์ฐ CMD ["apache2", "-DFOREGROUND"]
์ ๊ฐ์ ๊ฒ์ ์คํํฉ๋๋ค.
์ค์ ๋ก ์ด๋ฌํ ํ์์ ์ง์นจ์ ๋ชจ๋ ์๋น์ค ๊ธฐ๋ฐ ์ด๋ฏธ์ง์ ๊ถ์ฅ๋ฉ๋๋ค.
๋๋ถ๋ถ์ ๋ค๋ฅธ ๊ฒฝ์ฐ CMD
์๋ bash, python ๋ฐ perl๊ณผ ๊ฐ์ ๋ํ ํ ์
ธ์ด ์ ๊ณต๋์ด์ผํฉ๋๋ค.
์๋ก : CMD ["perl", "-de0"]
, CMD ["python"]
๋๋ CMD ["php", "-a"]
.
์ด ํ์์ ์ฌ์ฉํ๋ฉด docker run -it python
๊ณผ ๊ฐ์ ๊ฒ์ ์คํํ ๋ ์ฌ์ฉํ ์์๋ ์๋ก ์ด๋ํ ์ค๋น๊ฐ ๋ ๊ฒ์
๋๋ค.
CMD
๋ ENTRYPOINT
์ ํจ๊ป CMD ["param", "param"]
๋ฐฉ์์ผ๋ก ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค.
์ฌ์ฉ์๋ ์ฌ์ ์ ENTRYPOINT
์ ์๋ ๋ฐฉ์์ ๋ํด ์ ์๊ณ ์์ด์ผ ํฉ๋๋ค.
EXPOSE
EXPOSE ๋ช ๋ น์ด์ ๋ํ Dockerfile ์ฐธ์กฐ
EXPOSE
๋ช
๋ น์ด๋ ์ปจํ
์ด๋๊ฐ ์ฐ๊ฒฐ์ ์์ ํ๋ ํฌํธ๋ฅผ ๋ํ๋
๋๋ค. ๋ฐ๋ผ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํด ์ผ๋ฐ์ ์ธ ์ผ๋ฐ ํฌํธ๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
์๋ฅผ ๋ค์ด Apache ์น ์๋ฒ๊ฐ ํฌํจ ๋ ์ด๋ฏธ์ง๋ EXPOSE 80
์ ์ฌ์ฉํ๊ณ MongoDB๋ฅผ ํฌํจํ๋ ์ด๋ฏธ์ง๋ EXPOSE 27017
๋ฑ์ ์ฌ์ฉํฉ๋๋ค.
์ธ๋ถ ์ก์ธ์ค๋ฅผ ์ํด ์ฌ์ฉ์๋ ์ง์ ๋ ํฌํธ๋ฅผ ์์ ์ด ์ ํํ ํฌํธ์ ๋งคํํ๋ ๋ฐฉ๋ฒ์ ๋ํ๋ด๋ ํ๋๊ทธ์ ํจ๊ป docker run
์ ์คํํ ์ ์์ต๋๋ค.
์ปจํ
์ด๋ ์ฐ๊ฒฐ์ ์ํด Docker๋ ์์ ์ ์ปจํ
์ด๋์์ ์์ค๊น์ง์ ๊ฒฝ๋ก์ ๋ํ ํ๊ฒฝ ๋ณ์๋ฅผ ์ ๊ณตํฉ๋๋ค (์ :MYSQL_PORT_3306_TCP
).
ENV
[ENV ๋ช ๋ น์ด์ ๋ํ Dockerfile ์ฐธ์กฐ] (https://docs.docker.com/engine/reference/builder/#env)
์ ์ํํธ์จ์ด๋ฅผ ๋ ์ฝ๊ฒ ์คํํ๋ ค๋ฉด ENV
๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํ
์ด๋๊ฐ ์ค์นํ๋ ์ํํธ์จ์ด์ PATH
ํ๊ฒฝ ๋ณ์๋ฅผ ์
๋ฐ์ดํธ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ENV PATH /usr/local/nginx/bin:$PATH
๋ CMD ["nginx"]
๊ฐ ์๋ํ๋๋ก ํฉ๋๋ค.
ENV
๋ช
๋ น์ด๋ Postgres์ PGDATA
์ ๊ฐ์ด ์ปจํ
์ด๋ํํ๋ ค๋ ์๋น์ค์ ํน์ ํ ํ์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ ๊ณตํ๋๋ฐ๋ ์ ์ฉํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ENV
๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฒ์ ๋ฒํธ๋ฅผ ์ค์ ํ๋๋ฐ๋ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ค์ ์์ ์ ๊ฐ์ด ๋ฒ์ ๋ฒํ๋ฅผ ์ ์งํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && โฆ
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
Similar to having constant variables in a program (as opposed to hard-coding values), this approach lets you change a single ENV
instruction to auto-magically bump the version of the software in your container.
๊ฐ ENV
๋ผ์ธ์ RUN
๋ช
๋ น๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ก์ด ์ค๊ฐ ๋ ์ด์ด๋ฅผ ์์ฑํฉ๋๋ค.
์ฆ, ํฅํ ๊ณ์ธต์์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํด์ ํ๋๋ผ๋ ์ด ๊ณ์ธต์์ ๊ณ์ ์ ์ง๋๋ฉฐ ํด๋น ๊ฐ์ ๋คํ ํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด Dockerfile์ ๋ง๋ ๋ค์ ๋น๋ํ์ฌ์ด๋ฅผ ํ
์คํธ ํ ์ ์์ต๋๋ค.
FROM alpine
ENV ADMIN_USER="mark"
RUN echo $ADMIN_USER > ./mark
RUN unset ADMIN_USER
$ docker run --rm test sh -c 'echo $ADMIN_USER'
mark
์ด๋ฅผ ๋ฐฉ์งํ๊ณ ์ค์ ๋ก ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํด์ ํ๋ ค๋ฉด ์ ๋ช
๋ น๊ณผ ํจ๊ป RUN
๋ช
๋ น์ ์ฌ์ฉํ์ฌ ๋จ์ผ ๋ ์ด์ด์์ ๋ณ์๋ฅผ ์ค์ , ์ฌ์ฉ ๋ฐ ์ค์ ํด์ ํ์ญ์์ค.
;
๋๋ &&
๋ก ๋ช
๋ น์ ๋ถ๋ฆฌ ํ ์ ์์ต๋๋ค. ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ๋ช
๋ น ์ค ํ๋๊ฐ ์คํจํ๋ฉด docker build
๋ ์คํจํฉ๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ข์ ์๊ฐ์
๋๋ค.
Linux Dockerfiles์ ์ค ์ฐ์ ๋ฌธ์๋ก \
๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋
์ฑ์ด ํฅ์๋ฉ๋๋ค.
๋ชจ๋ ๋ช
๋ น์ ์ ์คํฌ๋ฆฝํธ์ ๋ฃ๊ณ RUN
๋ช
๋ น์ด ํด๋น ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋๋ก ํ ์๋ ์์ต๋๋ค.
FROM alpine
RUN export ADMIN_USER="mark" \
&& echo $ADMIN_USER > ./mark \
&& unset ADMIN_USER
CMD sh
$ docker run --rm test sh -c 'echo $ADMIN_USER'
ADD or COPY
ADD
์ COPY
๋ ๊ธฐ๋ฅ์ ์ผ๋ก ์ ์ฌํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก COPY
๊ฐ ์ ํธ๋ฉ๋๋ค. ADD
๋ณด๋ค ํฌ๋ช
ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
COPY
๋ ์ปจํ
์ด๋์ ๋ก์ปฌ ํ์ผ์ ๊ธฐ๋ณธ ๋ณต์ฌ ๋ง ์ง์ํ๋ ๋ฐ๋ฉด ADD
์๋ ์ฆ์ ๋ช
ํํ์ง ์์ ์ผ๋ถ ๊ธฐ๋ฅ (๋ก์ปฌ ์ ์ฉ tar ์ถ์ถ ๋ฐ ์๊ฒฉ URL ์ง์)์ด ์์ต๋๋ค.
๋ฐ๋ผ์ ADD
์ ๊ฐ์ฅ ์ข์ ์ฉ๋๋ ADD rootfs.tar.xz /
์์์ ๊ฐ์ด ๋ก์ปฌ tar ํ์ผ์ ์ด๋ฏธ์ง๋ก ์๋ ์ถ์ถํ๋ ๊ฒ์
๋๋ค.
์ปจํ
์คํธ์ ๋ค๋ฅธ ํ์ผ์ ์ฌ์ฉํ๋ ์ฌ๋ฌ Dockerfile
๋จ๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ ํ ๋ฒ์ ๋ชจ๋๊ฐ ์๋ ๊ฐ๋ณ์ ์ผ๋ก COPY
ํ์ญ์์ค.
์ด๋ ๊ฒํ๋ฉด ํน๋ณํ ํ์ํ ํ์ผ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ๊ฐ ๋จ๊ณ์ ๋น๋ ์บ์๊ฐ ๋ฌดํจํ๋ฉ๋๋ค (๋จ๊ณ๋ฅผ ๋ค์ ์คํํด์ผ ํจ).
์๋ฅผ ๋ค๋ฉด :
COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/
COPY . /tmp/
๋ฅผ ์์ ๋ ๊ฒฝ์ฐ๋ณด๋ค RUN
๋จ๊ณ์ ๋ํ ์บ์ ๋ฌดํจํ๊ฐ ๋ ์ ์ต๋๋ค.
์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ์ค์ํ๋ฏ๋ก ADD
๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฒฉ URL์์ ํจํค์ง๋ฅผ ๊ฐ์ ธ ์ค๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์์ต๋๋ค. ๋์ curl
๋๋ wget
์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ด๋ ๊ฒํ๋ฉด ๋ ์ด์ ํ์ํ์ง ์์ ํ์ผ์ ์ถ์ถํ ํ ์ญ์ ํ ์ ์์ผ๋ฉฐ ์ด๋ฏธ์ง์ ๋ค๋ฅธ ๋ ์ด์ด๋ฅผ ์ถ๊ฐ ํ ํ์๊ฐ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ํ์๋ ํผํด์ผํฉ๋๋ค.
ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all
๋์ ๋ค์๊ณผ ๊ฐ์ดํ์ญ์์ค.
RUN mkdir -p /usr/src/things \
&& curl -SL http://example.com/big.tar.xz \
| tar -xJC /usr/src/things \
&& make -C /usr/src/things all
ADD
์ tar ์๋ ์ถ์ถ ๊ธฐ๋ฅ์ด ํ์ํ์ง ์์ ๋ค๋ฅธ ํญ๋ชฉ(ํ์ผ, ๋๋ ํ ๋ฆฌ)์ ๊ฒฝ์ฐ ํญ์ COPY
๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
ENTRYPOINT
Dockerfile reference for the ENTRYPOINT instruction
ENTRYPOINT
์ ๊ฐ์ฅ ์ข์ ์ฉ๋๋ ์ด๋ฏธ์ง์ ๊ธฐ๋ณธ ๋ช
๋ น์ ์ค์ ํ์ฌ ํด๋น ์ด๋ฏธ์ง์ ๋ช
๋ น์ธ ๊ฒ์ฒ๋ผ ์คํ๋๋๋ก ํ์ฉํ๋ ๊ฒ์
๋๋ค (๊ทธ๋ฐ ๋ค์ CMD
๋ฅผ ๊ธฐ๋ณธ ํ๋๊ทธ๋ก ์ฌ์ฉ).
๋ช ๋ น ์ค ๋๊ตฌ 's3cmd'์ ๋ํ ์ด๋ฏธ์ง์ ์๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค.
ENTRYPOINT ["s3cmd"]
CMD ["--help"]
์ด์ ์ด๋ฏธ์ง๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์คํํ์ฌ ๋ช ๋ น์ ๋์๋ง์ ํ์ ํ ์ ์์ต๋๋ค.
$ docker run s3cmd
๋๋ ์ฌ๋ฐ๋ฅธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ๋ น์ ์คํํฉ๋๋ค.
$ docker run s3cmd ls s3://mybucket
์ด๊ฒ์ ์์ ๋ช ๋ น์ ํ์๋๋๋ก ์ด๋ฏธ์ง ์ด๋ฆ์ด ๋ฐ์ด๋๋ฆฌ์ ๋ํ ์ฐธ์กฐ๋ก ๋ ๋ฐฐ๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ฉํฉ๋๋ค.
ENTRYPOINT
๋ช
๋ น์ด๋ ๋์ฐ๋ฏธ ์คํฌ๋ฆฝํธ์ ํจ๊ป ์ฌ์ฉํ ์๋ ์์ด, ๋๊ตฌ๋ฅผ ์์ํ๋๋ฐ ๋ ๋จ๊ณ ์ด์์ด ํ์ํ ๋๋ ์์ ๋ช
๋ น๊ณผ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์๋ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด Postgres ๊ณต์ ์ด๋ฏธ์ง๋ ๋ค์๊ณผ ๊ฐ์ ์คํฌ๋ฆฝํธ๋ฅผ ENTRYPOINT
๋ก ์ฌ์ฉํ๋ค.
#!/bin/bash
set -e
if [ "$1" = 'postgres' ]; then
chown -R postgres "$PGDATA"
if [ -z "$(ls -A "$PGDATA")" ]; then
gosu postgres initdb
fi
exec gosu postgres "$@"
fi
exec "$@"
์ฑ์ PID 1๋ก ๊ตฌ์ฑ
์ด ์คํฌ๋ฆฝํธ๋
exec
Bash ๋ช ๋ น์ ์ฌ์ฉํ๋ฏ๋ก ์ต์ข ์คํ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปจํ ์ด๋์ PID 1์ด ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ด๋๋ก ์ ์ก ๋ ๋ชจ๋ Unix ์ ํธ๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ENTRYPOINT
์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
๋์ฐ๋ฏธ ์คํฌ๋ฆฝํธ๋ ์ปจํ
์ด๋์ ๋ณต์ฌ๋๊ณ ์ปจํ
์ด๋ ์์์ ENTRYPOINT
๋ฅผ ํตํด ์คํ๋ฉ๋๋ค.
COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["postgres"]
์ด ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ฌ์ฉ์๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก Postgres์ ์ํธ ์์ฉํ ์ ์์ต๋๋ค.
๊ฐ๋จํ Postgres๋ฅผ ์์ํ ์ ์์ต๋๋ค.
$ docker run postgres
๋๋ Postgres๋ฅผ ์คํํ๊ณ ๋งค๊ฐ ๋ณ์๋ฅผ ์๋ฒ์ ์ ๋ฌํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
$ docker run postgres postgres --help
๋ง์ง๋ง์ผ๋ก Bash์ ๊ฐ์ ์์ ํ ๋ค๋ฅธ ๋๊ตฌ๋ฅผ ์์ํ๋ ๋ฐ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
$ docker run --rm -it postgres bash
VOLUME
VOLUME ๋ช ๋ น์ ๋ํ Dockerfile ์ฐธ์กฐ
VOLUME
๋ช
๋ น์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ์ ์์ญ, ๊ตฌ์ฑ ์ ์ฅ์ ๋๋ Docker ์ปจํ
์ด๋์์ ์์ฑ ํ ํ์ผ/ํด๋๋ฅผ ๋
ธ์ถํ๋ ๋ฐ ์ฌ์ฉํด์ผํฉ๋๋ค.
์ด๋ฏธ์ง์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ํ๊ฑฐ๋ ์ฌ์ฉ์ ์๋น์ค ๊ฐ๋ฅ ๋ถ๋ถ์ VOLUME
์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
USER
USER ๋ช ๋ น์ ๋ํ Dockerfile ์ฐธ์กฐ
๊ถํ์์ด ์๋น์ค๋ฅผ ์คํํ ์ ์๋ ๊ฒฝ์ฐ USER
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฃจํธ๊ฐ ์๋ ์ฌ์ฉ์๋ก ๋ณ๊ฒฝํ์ญ์์ค.
RUN groupadd -r postgres && useradd --no-log-init -r -g postgres postgres
์ ๊ฐ์ด Dockerfile
์ ์ฌ์ฉ์์ ๊ทธ๋ฃน์ ์์ฑํ์ฌ ์์ํฉ๋๋ค.
๋ช ์์ ์ธ UID / GID ๊ณ ๋ ค
์ด๋ฏธ์ง์ ์ฌ์ฉ์ ๋ฐ ๊ทธ๋ฃน์๋ ์ด๋ฏธ์ง ์ฌ ๊ตฌ์ถ์ ๊ด๊ณ์์ด "๋ค์" UID/GID๊ฐ ํ ๋น๋๋ค๋ ์ ์์ ๋น ๊ฒฐ์ ์ UID/GID๊ฐ ํ ๋น๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ค์ํ ๊ฒฝ์ฐ ๋ช ์์ ์ธ UID/GID๋ฅผ ํ ๋นํด์ผํฉ๋๋ค.
Go ์์นด์ด๋ธ/tar ํจํค์ง์ ๋น์ฝํ ํ์ผ ๊ด๋ฆฌ์์ ํด๊ฒฐ๋์ง ์์ ๋ฒ๊ทธ๋ก ์ธํด Docker ์ปจํ ์ด๋ ๋ด์ ์๋นํ ํฐ UID๋ฅผ ๊ฐ์ง ์ฌ์ฉ์๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ฉด ์ปจํ ์ด๋ ๊ณ์ธต์
/var/log/faillog
๊ฐ NULL(\0) ๋ฌธ์๋ก ์ฑ์์ง๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์--no-log-init
ํ๋๊ทธ๋ฅผ useradd์ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค. Debian/Ubuntuadduser
๋ช ๋ น์ด๋ ์ด ํ๋๊ทธ๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
์์ธกํ ์์๋ TTY ๋ฐ ์ ํธ ์ ๋ฌ ๋์์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฏ๋ก sudo
๋ฅผ ์ค์นํ๊ฑฐ๋ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
root
๊ฐ ์๋ ์ฌ์ฉ์๋ก ์คํํ์ง๋ง ๋ฐ๋ชฌ์ root
๋ก ์ด๊ธฐํ ํ๋ ๋ฑ sudo
์ ์ ์ฌํ ๊ธฐ๋ฅ์ด ์ ๋์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ "gosu" ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์.
๋ง์ง๋ง์ผ๋ก ๋ ์ด์ด์ ๋ณต์ก์ฑ์ ์ค์ด๋ ค๋ฉด USER
๋ฅผ ์์ฃผ ์๋ค๋ก ์ ํํ์ฌ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
WORKDIR
WORKDIR ๋ช ๋ น์ด์ ๋ํ Dockerfile ์ฐธ์กฐ
๋ช
ํ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ์ํด ํญ์ WORKDIR
์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
๋ํ ์ฝ๊ธฐ, ๋ฌธ์ ํด๊ฒฐ, ์ ์ง ๊ด๋ฆฌ๊ฐ ์ด๋ ค์ด RUN cdโฆ && do-something
๊ณผ ๊ฐ์ ๋ช
๋ น์ ํ์ฐ์ํค๋ ๋์ WORKDIR
์ ์ฌ์ฉํด์ผํฉ๋๋ค.
ONBUILD
ONBUILD ๋ช ๋ น์ด์ ๋ํ Dockerfile ์ฐธ์กฐ
ONBUILD
๋ช
๋ น์ ํ์ฌ Dockerfile
๋น๋๊ฐ ์๋ฃ๋ ํ ์คํ๋ฉ๋๋ค.
ONBUILD
๋ ํ์ฌ ์ด๋ฏธ์ง์ FROM
์์ ํ์ ๋ ๋ชจ๋ ํ์ ์ด๋ฏธ์ง์์ ์คํ๋ฉ๋๋ค.
ONBUILD
๋ช
๋ น์ ๋ถ๋ชจ Dockerfile
์ด ํ์ Dockerfile
์๊ฒ ์ ๊ณตํ๋ ๋ช
๋ น์ผ๋ก ์๊ฐํ์ญ์์ค.
Docker ๋น๋๋ ํ์ Dockerfile
์ ๋ช
๋ น๋ณด๋ค ๋จผ์ ONBUILD
๋ช
๋ น์ ์คํํฉ๋๋ค.
ONBUILD
๋ ์ฃผ์ด์ง ์ด๋ฏธ์ง์์ FROM
์ผ๋ก ๋น๋ ๋ ์ด๋ฏธ์ง์ ์ ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด Ruby์ ONBUILD
๋ณํ์์ ๋ณผ ์ ์๋ฏ์ด Dockerfile
๋ด์์ ํด๋น ์ธ์ด๋ก ์์ฑ๋ ์์ ์ฌ์ฉ์ ์ํํธ์จ์ด๋ฅผ ๋น๋ํ๋ ์ธ์ด ์คํ ์ด๋ฏธ์ง์ ONBUILD
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ONBUILD
๋ก ๋น๋ ๋ ์ด๋ฏธ์ง๋ ๋ณ๋์ ํ๊ทธ๋ฅผ ๊ฐ์ ธ์ผํฉ๋๋ค (์ : ruby:1.9-onbuild
๋๋ ruby:2.0-onbuild
).
ONBUILD
์ ADD
๋๋ COPY
๋ฅผ ๋ฃ์ ๋ ์ฃผ์ํ์ธ์.
์ ๋น๋์ ์ปจํ
์คํธ์ ์ถ๊ฐ๋๋ ๋ฆฌ์์ค๊ฐ ๋๋ฝ ๋ ๊ฒฝ์ฐ "onbuild" ์ด๋ฏธ์ง๊ฐ ์ฒ์ฐธํ ์คํจํฉ๋๋ค.
์์์ ๊ถ์ฅํ๋๋ก ๋ณ๋์ ํ๊ทธ๋ฅผ ์ถ๊ฐํ๋ฉด Dockerfile
์์ฑ์๊ฐ ์ ํํ ์ ์๋๋กํ์ฌ ์ด๋ฅผ ์ํํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค.
๊ณต์ ์ด๋ฏธ์ง์ ์
์ด ๊ณต์ ์ด๋ฏธ์ง์๋ ๋ํ์ ์ธ Dockerfile
์ด ์์ต๋๋ค.
์ถ๊ฐ ๋ฆฌ์์ค :
Last updated
Was this helpful?