ENTRYPOINT์ CMD์ ๊ด๊ณ
Dockerfile์์ ์์ฃผ ์ฌ์ฉ๋๋ ENTRYPOINT์ CMD ๋ช ๋ น์ด์ ๊ด๊ณ์ ์ฌ์ฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค. ์ด ๋ ๋ช ๋ น์ด๋ ์ปจํ ์ด๋๊ฐ ์์๋ ๋ ์คํ๋ ๋ช ๋ น์ด๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋์ง๋ง, ๊ทธ ๋์ ๋ฐฉ์๊ณผ ๋ชฉ์ ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๋ํ, shell ํ์๊ณผ exec ํ์์ ๋ํ ์ดํด๋ ์ค์ํฉ๋๋ค. ์ด ๊ธ์์๋ ์ด๋ฌํ ๊ฐ๋ ๋ค์ ๋ช ํํ๊ฒ ์ดํดํ๊ณ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ ์ ์๋๋ก ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค.
Shell ํ์๊ณผ Exec ํ์
Dockerfile์์ ๋ช ๋ น์ด๋ฅผ ์์ฑํ ๋ shell ํ์๊ณผ exec ํ์ ๋ ๊ฐ์ง ๋ฐฉ์์ด ์์ต๋๋ค. ์ด ๋ ํ์์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ๋ฐฉ์์ ์ฐจ์ด๊ฐ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
Shell ํ์
Shell ํ์์ ํฐ๋ฏธ๋์์ ์ง์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ ๊ฒ๊ณผ ์ ์ฌํ๊ฒ ์์ฑํ๋ ๋ฐฉ์์ ๋๋ค. ๋จ์ผ ๋ฌธ์์ด๋ก ๋ช ๋ น์ด๋ฅผ ์์ฑํ๋ฉฐ, ์์ ํตํด ์คํ๋ฉ๋๋ค.
RUN npm ci \
&& npm run build
ํน์ง
- ์ ํ๋ก์ธ์ค๋ฅผ ํตํด ์คํ๋ฉ๋๋ค.
- ํ๊ฒฝ ๋ณ์ ์นํ ๋ฐ ์ ๊ธฐ๋ฅ(์: ํ์ดํ, ๋ฆฌ๋๋ ์ )์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์์ ํตํด ๋ช ๋ น์ด๊ฐ ์คํ๋๋ฏ๋ก PID 1๋ก ์์ด ์คํ๋ฉ๋๋ค.
Exec ํ์
Exec ํ์์ JSON ๋ฐฐ์ด ํํ๋ก ๋ช ๋ น์ด์ ๊ทธ ์ธ์๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ์ฌ ์์ฑํ๋ ๋ฐฉ์์ ๋๋ค. ์์ ์ฌ์ฉํ์ง ์๊ณ ์ง์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
ENTRYPOINT ["npm", "run", "start"]
ํน์ง
- ์์ ์ฌ์ฉํ์ง ์๊ณ ์ง์ ์คํ๋๋ฏ๋ก ์ ํ๋ก์ธ์ฑ์ด ์ผ์ด๋์ง ์์ต๋๋ค.
- PID 1๋ก ์ง์ ๋ ๋ช ๋ น์ด๊ฐ ์คํ๋ฉ๋๋ค.
- ํ๊ฒฝ ๋ณ์ ์นํ์ด ์๋์ผ๋ก ์ด๋ฃจ์ด์ง์ง ์์ต๋๋ค.
์ฃผ์์ฌํญ: Exec ํ์์ผ๋ก ์์ฑํ ๋๋ ์์๋ฐ์ดํ(')๊ฐ ์๋ ๋ฐ๋์ ํฐ ๋ฐ์ดํ(")๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
RUN vs CMD vs ENTRYPOINT
Dockerfile์์ RUN, CMD, ENTRYPOINT๋ ๋ชจ๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋์ง๋ง, ๊ทธ ์์ ๊ณผ ๋ชฉ์ ์ด ๋ค๋ฆ ๋๋ค.
RUN ๋ช ๋ น์ด
- ์ฉ๋: ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ๋ ์คํํ ๋ช ๋ น์ด๋ฅผ ์ ์ํฉ๋๋ค.
- ์์ : docker build ๊ณผ์ ์ค์ ์คํ๋ฉ๋๋ค.
- ์์: RUN npm ci \ && npm run build
- ํน์ง:
- ์ด๋ฏธ์ง ๋ ์ด์ด๋ฅผ ์์ฑํ๋ฉฐ, ๋น๋ ์์ ์ ํ์ํ ํ์ผ์ ์ค์นํ๊ฑฐ๋ ์ค์ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
- ์ปจํ ์ด๋ ์คํ ์์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
CMD ๋ช ๋ น์ด
- ์ฉ๋: ์ปจํ ์ด๋๊ฐ ์์๋ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํํ ๋ช ๋ น์ด๋ฅผ ์ ์ํฉ๋๋ค.
- ์์ : docker run ์์ ์ ์คํ๋ฉ๋๋ค.
- ์์: CMD ["echo", "Welcome to kakao."]
- ํน์ง:
- ์ปจํ ์ด๋ ์คํ ์ ๊ธฐ๋ณธ ๋ช ๋ น์ด๋ฅผ ์ค์ ํ๋ฉฐ, docker run ๋ช ๋ น์ด์์ ๋ช ๋ น์ด๋ฅผ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
- ๋จ์ผ ๋ช ๋ น์ด ๋๋ ๋ฐฐ์ด ํ์์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
ENTRYPOINT ๋ช ๋ น์ด
- ์ฉ๋: ์ปจํ ์ด๋๊ฐ ์์๋ ๋ ๋ฐ๋์ ์คํํด์ผ ํ๋ ๋ช ๋ น์ด๋ฅผ ์ ์ํฉ๋๋ค.
- ์์ : docker run ์์ ์ ์คํ๋ฉ๋๋ค.
- ์์: ENTRYPOINT ["npm", "run", "start"]
- ํน์ง:
- CMD์ ์ ์ฌํ์ง๋ง, ENTRYPOINT๋ ๋ฎ์ด์ธ ์ ์๊ณ ํญ์ ์คํ๋ฉ๋๋ค.
- Exec ํ์์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
CMD vs ENTRYPOINT
CMD์ ENTRYPOINT๋ ์ปจํ ์ด๋๊ฐ ์์๋ ๋ ์คํํ ๋ช ๋ น์ด๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋์ง๋ง, ๊ทธ ๋์ ๋ฐฉ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
CMD
- ์ ์ฐ์ฑ: docker run ๋ช ๋ น์ด์์ ๋ช ๋ น์ด๋ฅผ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
- ์ฉ๋: ๊ธฐ๋ณธ ๋ช ๋ น์ด ๋๋ ์ธ์๋ฅผ ์ค์ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ์์
docker container run myimage echo "Learn to love learning." # ์ถ๋ ฅ: Learn to love learning.
- CMD ["echo", "Welcome to Codeit."]
ENTRYPOINT
- ๊ณ ์ ์ฑ: docker run ๋ช ๋ น์ด์์ ๋ฎ์ด์ธ ์ ์์ผ๋ฉฐ, ํญ์ ์คํ๋ฉ๋๋ค.
- ์ฉ๋: ์ปจํ ์ด๋์ ์ฃผ๋ ๊ธฐ๋ฅ์ ์คํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ์์
docker container run myimage # ํญ์ 'npm run start'๊ฐ ์คํ๋ฉ๋๋ค.
- ENTRYPOINT ["npm", "run", "start"]
ํจ๊ป ์ฌ์ฉํ๊ธฐ
CMD์ ENTRYPOINT๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด, CMD๋ ENTRYPOINT์ ์ธ์๋ก ์๋ํ๊ฒ ๋ฉ๋๋ค.
FROM ubuntu
CMD ["Kakao"]
ENTRYPOINT ["echo", "Welcome To "]
docker container run myimage Seoul
# ์ถ๋ ฅ: Welcome To Seoul
docker container run myimage Busan
# ์ถ๋ ฅ: Welcome To Busan
- ์ฅ์ : ENTRYPOINT๋ ๊ณ ์ ๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด์, CMD๋ฅผ ํตํด ์ ์ฐํ๊ฒ ์ธ์๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
- ์ฃผ์์ฌํญ: ENTRYPOINT์ CMD์ ์กฐํฉ์ ์ดํดํ๊ณ ์ ์ ํ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
CMD์ ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ
CMD๋ ENTRYPOINT์ ํจ๊ป ์ฌ์ฉํ ๋ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. CMD๋ ENTRYPOINT์์ ์คํํ ๋ช ๋ น์ด์ ํ๋ผ๋ฏธํฐ ์ญํ ์ ํฉ๋๋ค.
์์
FROM ubuntu
CMD ["Kakao"]
ENTRYPOINT ["echo", "Welcome To "]
docker container run myimage Seoul
# ์ถ๋ ฅ: Welcome To Seoul
docker container run myimage Busan
# ์ถ๋ ฅ: Welcome To Busan
- ๋์ ๋ฐฉ์:
- ENTRYPOINT๋ ํญ์ ์คํ๋๋ฉฐ, CMD๋ ๊ทธ ์ธ์๋ก ์ ๋ฌ๋ฉ๋๋ค.
- docker run ๋ช ๋ น์ด์์ CMD๋ฅผ ์ฌ์ ์ํ๋ฉด, ENTRYPOINT์ ์ธ์๋ก ์๋ก์ด ๊ฐ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
Tip: CMD๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ์ธ์๋ฅผ ์ค์ ํ๊ณ , ํ์์ ๋ฐ๋ผ ๋ฎ์ด์ธ ์ ์๋๋ก ์ค๊ณํ๋ฉด ์ ์ฐํ Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
ENV์ ARG ์ฌ์ฉ ์ ์ ์์ฌํญ
Dockerfile์์ ENV์ ARG๋ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ์ฌ์ฉํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ ๋ช ๋ น์ด๋ ์ฌ์ฉ ๋ชฉ์ ๊ณผ ๋ฒ์๊ฐ ๋ค๋ฅด๋ฏ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
ENV์ ARG ๋น๊ต
ํน์ง | ENV | ARG |
์ฉ๋ | ์ปจํ ์ด๋ ์คํ ์ ํ๊ฒฝ ๋ณ์ ์ค์ | ์ด๋ฏธ์ง ๋น๋ ์ ๋ณ์ ์ค์ |
์์ | ์ปจํ ์ด๋ ์คํ ์ | ์ด๋ฏธ์ง ๋น๋ ์ |
์ฌ์ ์ ๊ฐ๋ฅ์ฑ | docker run -e ์ต์ ์ผ๋ก ์ฌ์ ์ ๊ฐ๋ฅ | docker build --build-arg ์ต์ ์ผ๋ก ์ฌ์ ์ ๊ฐ๋ฅ |
์๋ช ์ฃผ๊ธฐ | ์ด๋ฏธ์ง ๋น๋ ์์ ๋ถํฐ ์ปจํ ์ด๋ ์คํ ํ๊น์ง | ์ด๋ฏธ์ง ๋น๋ ์์ ๋์๋ง ์ ํจ |
๊ธฐ๋ณธ๊ฐ ์ค์ | ๋ฐ๋์ ๊ธฐ๋ณธ๊ฐ์ ์ด๊ธฐํํด์ผ ํจ | ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ์ง ์์๋ ๋จ |
์ฌ์ฉ ์์
ENV
ENV PORT=3000
- ์ฉ๋: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ ๋ ํ์ํ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฌ์ ์: docker run -e PORT=4000๊ณผ ๊ฐ์ด ์คํ ์์ ์ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
ARG
ARG NODE_VERSION=20.15.1
- ์ฉ๋: ์ด๋ฏธ์ง ๋น๋ ์ ํน์ ๋ฒ์ ์ Node.js๋ฅผ ์ค์นํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฌ์ ์: docker build --build-arg NODE_VERSION=14.17.0 .๊ณผ ๊ฐ์ด ๋น๋ ์์ ์ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
๋ณ์ ์ฐธ์กฐ ํ
Dockerfile์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ๋๋ ${VARIABLE} ํ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ๋ณ์์ ๋ฌธ์์ด์ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ๋ณ์ ๊ฐ์ด ์์ ๋ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์์
ENV VARIABLE=Hello
RUN echo "$VARIABLE_World" # ์ถ๋ ฅ: My name is ${VARIABLE}
RUN echo "${VARIABLE}_World" # ์ถ๋ ฅ: Hello_World
FROM ubuntu
ENV MY_NAME=Ryan
ENTRYPOINT ["echo", "My name is ${MY_NAME}"]
# ์ถ๋ ฅ: My name is Ryan
# ์๋ชป๋ ์์
ENTRYPOINT ["echo", "My name is $MY_NAME"]
# ์ถ๋ ฅ: My name is ${MY_NAME}
์ฅ์
- ๋ณ์์ ๋ฌธ์์ด์ด ๋ช ํํ๊ฒ ๊ตฌ๋ถ๋ฉ๋๋ค.
- ์กฐ๊ฑด๋ถ ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
์กฐ๊ฑด๋ถ ๋ณ์ ์ค์
ENV GREETING=${NAME:-Hi}
- ์ค๋ช : NAME ๋ณ์๊ฐ ์ค์ ๋์ด ์์ผ๋ฉด ๊ทธ ๊ฐ์ ์ฌ์ฉํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด Hi๋ฅผ ์ฌ์ฉํฉ๋๋ค.
FROM ubuntu
ENV GREETING=${NAME:-Hi}
CMD ["echo", "${GREETING}, Welcome!"]
docker container run myimage
# ์ถ๋ ฅ: Hi, Welcome!
docker container run -e NAME=Kakao myimage
# ์ถ๋ ฅ: Kakao, Welcome!
Dockerfile ์์ฑ ํ
Dockerfile์ ์์ฑํ ๋๋ ENTRYPOINT์ CMD์ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ๋ฒ์ ์์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ค์์ Dockerfile ์์ฑ ์ ์ ์ฉํ ํ์ ๋๋ค.
1. ENTRYPOINT๋ Exec ํ์์ผ๋ก ์์ฑ
ENTRYPOINT๋ ๊ณ ์ ๋ ๋ช ๋ น์ด๋ฅผ ์คํํ ๋ ์ฌ์ฉํ๋ฏ๋ก, Exec ํ์(["executable", "param1", "param2"])์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ์ ํ๋ก์ธ์ฑ์ ํผํ๊ณ , ์ปจํ ์ด๋์ PID 1๋ก ์ง์ ๋ ํ๋ก์ธ์ค๊ฐ SIGTERM ์๊ทธ๋์ ์ง์ ๋ฐ์ ์ ์๊ฒ ํด์ค๋๋ค.
ENTRYPOINT ["npm", "run", "start"]
2. CMD๋ ๊ธฐ๋ณธ ์ธ์๋ฅผ ์ค์ ํ ๋ ์ฌ์ฉ
CMD๋ ENTRYPOINT์ ์ธ์๋ฅผ ์ค์ ํ๊ฑฐ๋, ๊ธฐ๋ณธ ๋ช ๋ น์ด๋ฅผ ์ค์ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. Exec ํ์์ผ๋ก ์์ฑํ์ฌ ์ผ๊ด์ฑ์ ์ ์งํฉ๋๋ค.
CMD ["--help"]
3. RUN์ ๋น๋ ์์ ์ ์ค์ ์ ์ฌ์ฉ
RUN ๋ช ๋ น์ด๋ ์ด๋ฏธ์ง ๋น๋ ์ ํ์ํ ํจํค์ง ์ค์น๋ ์ค์ ์์ ์ ์ฌ์ฉ๋ฉ๋๋ค.
RUN apt-get update && apt-get install -y curl
4. ENV์ ARG์ ์ ์ ํ ์ฌ์ฉ
- ENV: ์ปจํ ์ด๋ ์คํ ์ ํ์ํ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
- ARG: ์ด๋ฏธ์ง ๋น๋ ์ ํ์ํ ๋ณ์๋ฅผ ์ค์ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
์ฐธ๊ณ ์๋ฃ
- Dockerfile ๊ณต์ ๋ฌธ์: https://docs.docker.com/engine/reference/builder/
- Docker Compose ๊ณต์ ๋ฌธ์: https://docs.docker.com/compose/
- Docker Volume CLI Reference: Docker Volume Commands
- Docker Networking Best Practices: Networking Best Practices
- Docker Bind Mounts vs Volumes: Bind Mounts vs Volumes
- Docker ENV vs ARG: ENV vs ARG
'โ๏ธ Cloud Native > ๐ณ Docker' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker] Docker Compose: ๋ค์ค ์ปจํ ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ด๋ฆฌํ๊ธฐ (0) | 2025.01.17 |
---|---|
[Docker] Docker Volume: ๋์ปค ๋ณผ๋ฅจ, ์ปจํ ์ด๋ ๋ฐ์ดํฐ ๊ด๋ฆฌ (0) | 2025.01.17 |
[Docker] Docker Network: ๋์ปค ๋คํธ์ํฌ (0) | 2025.01.15 |
[Docker] Docker Container ์คํํ๊ธฐ: ๋จ๊ณ๋ณ ๊ฐ์ด๋ (0) | 2025.01.15 |
[Docker] Docker ์ด๋ฏธ์ง ๋น๋ & ๋ฐฐํฌ (0) | 2025.01.10 |