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 ํŒŒ์ดํ”„

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/Ubuntu adduser ๋ช…๋ น์–ด๋Š” ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ์ธกํ•  ์ˆ˜์—†๋Š” 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