Skip to content

Dockerfile Instructions - Part 2 đŸ› ī¸ ​

Dockerfile-āĻāϰ āĻĒā§āϰāĻĨāĻŽ āĻĒāĻžāĻ°ā§āĻŸā§‡ āφāĻŽāϰāĻž āĻŦ⧇āϏāĻŋāĻ• āĻ•āĻŋāϛ⧁ āχāĻ¨ā§āϏāĻŸā§āϰāĻžāĻ•āĻļāύ āĻļāĻŋāϖ⧇āĻ›āĻŋāĨ¤ āĻāχ āĻĒāĻžāĻ°ā§āĻŸā§‡ āφāĻŽāϰāĻž āφāϰāĻ“ āĻ•āĻŋāϛ⧁ āĻ…ā§āϝāĻžāĻĄāĻ­āĻžāĻ¨ā§āϏāĻĄ āχāĻ¨ā§āϏāĻŸā§āϰāĻžāĻ•āĻļāύ āύāĻŋā§Ÿā§‡ āφāϞ⧋āϚāύāĻž āĻ•āϰāĻŦā§‹ āϝ⧇āϗ⧁āϞ⧋ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇āϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ, āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āĻāĻŦāĻ‚ āĻĄā§‡āϟāĻž āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻ…āĻ¤ā§āϝāĻ¨ā§āϤ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖāĨ¤


ā§§. ENV vs ARG (āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āϟ) ​

āĻĄāĻ•āĻžāϰ⧇ āĻĻ⧁āχ āϧāϰāύ⧇āϰ āϭ⧇āϰāĻŋā§Ÿā§‡āĻŦāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšā§Ÿ:

  • ENV (Environment Variable): āĻāϟāĻŋ āχāĻŽā§‡āϜ āĻŦāĻŋāĻ˛ā§āĻĄ āĻšāĻ“ā§ŸāĻžāϰ āϏāĻŽā§Ÿ āĻāĻŦāĻ‚ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āϰāĻžāύ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿâ€”āωāϭ⧟ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇āχ āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžā§ŸāĨ¤
    dockerfile
    ENV APP_COLOR=blue
  • ARG (Build-time Variable): āĻāϟāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āχāĻŽā§‡āϜ āĻŦāĻŋāĻ˛ā§āĻĄ āĻšāĻ“ā§ŸāĻžāϰ āϏāĻŽā§Ÿ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āϰāĻžāύ āĻšā§Ÿā§‡ āϗ⧇āϞ⧇ āĻāχ āϭ⧇āϰāĻŋā§Ÿā§‡āĻŦāϞ āφāϰ āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžā§Ÿ āύāĻžāĨ¤
    dockerfile
    ARG VERSION=1.0

⧍. EXPOSE (āĻĒā§‹āĻ°ā§āϟ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ) ​

āφāĻĒāύāĻžāϰ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāϟāĻŋ āϕ⧋āύ āĻĒā§‹āĻ°ā§āĻŸā§‡ āϞāĻŋāϏ⧇āύ (Listen) āĻ•āϰāĻŦ⧇ āϏ⧇āϟāĻŋ āϜāĻžāύāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ EXPOSE āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšā§ŸāĨ¤

dockerfile
EXPOSE 8080

NOTE

āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ, EXPOSE āĻ•āĻŽāĻžāĻ¨ā§āĻĄāϟāĻŋ āύāĻŋāĻœā§‡ āĻĨ⧇āϕ⧇ āĻĒā§‹āĻ°ā§āϟ āĻ“āĻĒ⧇āύ āĻ•āϰ⧇ āύāĻžāĨ¤ āĻāϟāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤ āĻĒā§‹āĻ°ā§āϟ āĻ“āĻĒ⧇āύ āĻ•āϰāϤ⧇ āĻšāϞ⧇ āϰāĻžāύ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ -p āĻĢā§āĻ˛ā§āϝāĻžāĻ— āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšā§ŸāĨ¤


ā§Š. VOLUME (āĻŽāĻžāωāĻ¨ā§āϟ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ) ​

āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇āϰ āϭ⧇āϤāϰ⧇āϰ āϕ⧋āύ⧋ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰāϕ⧇ āĻšā§‹āĻ¸ā§āϟ āĻŽā§‡āĻļāĻŋāύ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāύ⧇āĻ•ā§āϟ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻŦāĻž āĻĄā§‡āϟāĻž āϏ⧇āĻ­ āϰāĻžāĻ–āĻžāϰ āϜāĻ¨ā§āϝ VOLUME āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšā§ŸāĨ¤

dockerfile
VOLUME ["/data"]

āĻāϟāĻŋ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āĻĄāĻŋāϞāĻŋāϟ āĻšā§Ÿā§‡ āϗ⧇āϞ⧇āĻ“ āφāĻĒāύāĻžāϰ āĻŽā§‚āĻ˛ā§āϝāĻŦāĻžāύ āĻĄā§‡āϟāĻž (āϝ⧇āĻŽāύ: āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻĢāĻžāχāϞ) āĻšāĻžāϰāĻŋā§Ÿā§‡ āϝāĻžāĻ“ā§ŸāĻž āĻĨ⧇āϕ⧇ āϰāĻ•ā§āώāĻž āĻ•āϰ⧇āĨ¤


ā§Ē. USER (āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ) ​

āĻĄāĻŋāĻĢāĻ˛ā§āϟāĻ­āĻžāĻŦ⧇ āĻĄāĻ•āĻžāϰ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ root āχāωāϜāĻžāϰ āĻšāĻŋāϏ⧇āĻŦ⧇ āϚāϞ⧇, āϝāĻž āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋāϰ āϜāĻ¨ā§āϝ āĻā§āρāĻ•āĻŋāĻĒā§‚āĻ°ā§āĻŖāĨ¤ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇ āĻ•āĻŽ āĻĒāĻžāĻ“ā§ŸāĻžāϰāĻĢ⧁āϞ āϕ⧋āύ⧋ āχāωāϜāĻžāϰ⧇ āϏ⧁āχāϚ āĻ•āϰāϤ⧇ USER āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšā§ŸāĨ¤

dockerfile
RUN useradd -m myuser
USER myuser

ā§Ģ. ENTRYPOINT vs CMD (āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻ•āύāĻĢāĻŋāωāϜāĻŋāĻ‚ āĻĒāĻžāĻ°ā§āϟ) ​

āĻāχ āĻĻ⧁āϟāĻŋ āχāĻ¨ā§āϏāĻŸā§āϰāĻžāĻ•āĻļāύ⧇āϰ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ āĻŦā§‹āĻāĻž āĻĄāĻ•āĻžāϰ āĻļ⧇āĻ–āĻžāϰ āϜāĻ¨ā§āϝ āϖ⧁āĻŦāχ āϜāϰ⧁āϰāĻŋ:

  • ENTRYPOINT: āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻĢāĻŋāĻ•ā§āϏāĻĄ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧇āĨ¤ āφāĻĒāύāĻŋ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āϰāĻžāύ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ āĻŦāĻžāχāϰ⧇ āĻĨ⧇āϕ⧇ āĻāϟāĻŋ āϏāĻšāĻœā§‡ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύ āύāĻžāĨ¤
    dockerfile
    ENTRYPOINT ["python"]
  • CMD: āĻāϟāĻŋ āĻŽā§‚āϞāϤ ENTRYPOINT-āĻāϰ āϜāĻ¨ā§āϝ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āφāĻ°ā§āϗ⧁āĻŽā§‡āĻ¨ā§āϟ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤ āϰāĻžāύ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ āĻŦāĻžāχāϰ⧇ āĻĨ⧇āϕ⧇ āφāĻĒāύāĻŋ āĻāϟāĻŋ āϏāĻšāĻœā§‡āχ āĻšā§‡āĻžā§āϜ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤
    dockerfile
    CMD ["app.py"]

āĻāĻ•āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇:

dockerfile
ENTRYPOINT ["python"]
CMD ["app.py"]

āĻāĻ–āύ āϰāĻžāύ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ:

  • docker run my-image āĻĻāĻŋāϞ⧇ āϚāϞāĻŦ⧇: python app.py
  • docker run my-image script.py āĻĻāĻŋāϞ⧇ āϚāϞāĻŦ⧇: python script.py (āĻāĻ–āĻžāύ⧇ CMD-āϕ⧇ āĻ“āĻ­āĻžāϰāϰāĻžāχāĻĄ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇)āĨ¤

āωāĻĻāĻžāĻšāϰāĻŖ āĻĒā§āϰ⧋āĻœā§‡āĻ•ā§āϟ (Advanced Dockerfile) ​

dockerfile
FROM python:3.9-slim

# ā§§. āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϏ⧇āϟ āφāĻĒ
ENV PYTHONUNBUFFERED=1

# ⧍. āĻ“ā§ŸāĻžāĻ°ā§āĻ• āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ
WORKDIR /code

# ā§Š. āχāωāϜāĻžāϰ āϤ⧈āϰāĻŋ āĻāĻŦāĻ‚ āϏ⧁āχāϚ
RUN useradd -m myuser
USER myuser

# ā§Ē. āĻĢāĻžāχāϞ āĻ•āĻĒāĻŋ
COPY . .

# ā§Ģ. āĻĒā§‹āĻ°ā§āϟ
EXPOSE 5000

# ā§Ŧ. āĻāĻ¨ā§āĻŸā§āϰāĻŋ āĻĒā§Ÿā§‡āĻ¨ā§āϟ āĻāĻŦāĻ‚ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ
ENTRYPOINT ["python"]
CMD ["main.py"]

CAUTION

āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋāϰ āĻ–āĻžāϤāĻŋāϰ⧇ āĻĒā§āϰ⧋āĻĄāĻžāĻ•āĻļāύ āχāĻŽā§‡āĻœā§‡ āϏāĻŦāϏāĻŽā§Ÿ USER āχāĻ¨ā§āϏāĻŸā§āϰāĻžāĻ•āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϰ⧁āϟ āĻāĻ•ā§āϏ⧇āϏ āĻŦāĻ¨ā§āϧ āϰāĻžāĻ–āĻž āωāϚāĻŋāϤāĨ¤

Released under the MIT License.