ЁЯУЭ рдзрдбрд╛ 03 тАФ Dockerfile: recipe card рд╡рд╛рдЪрдгреЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдорд╛рдЧреЗ: lesson-02-images-layers ┬╖ рдкреБрдвреЗ: lesson-04-run-containers
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ02, рдЖрдгрд┐ рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп: Dockerfile, рдУрд│-рдУрд│. рд╕рд╛рдд instructions рддреБрдореНрд╣реА рдХрдзреАрд╣реА рд╡рд╛рдЪрд╛рд▓ рдЕрд╢рд╛ рдмрд╣реБрддреЗрдХ Dockerfiles рд╡реНрдпрд╛рдкрддрд╛рдд. рдЦрд░реА file:
- app/Dockerfile тАФ рднрд░рдкреВрд░ comments рдЕрд╕рд▓реЗрд▓реА, рдпрд╛ рдзрдбреНрдпрд╛рдЪреЗ рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рддреБрдордЪрд╛ рдбрдмрд╛ рднрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдИрдЪреЗ recipe card ЁЯУЭ:
- "рджреБрдХрд╛рдирд╛рддрд▓реНрдпрд╛ рд╕рд╛рдзреНрдпрд╛ рдбрдмреНрдпрд╛рдкрд╛рд╕реВрди рд╕реБрд░реБрд╡рд╛рдд рдХрд░" тАФ
FROM node:20-alpine. рдХрдЪреНрдЪреНрдпрд╛ plastic рдкрд╛рд╕реВрди рдХрдзреАрдЪ рдбрдмрд╛ рдмрдирд╡реВ рдирдХрд╛; рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рддрдпрд╛рд░ рдбрдмреНрдпрд╛рдкрд╛рд╕реВрди рд╕реБрд░реБрд╡рд╛рдд рдХрд░рд╛. - "рд╕реНрд╡рдпрдВрдкрд╛рдХрдШрд░рд╛рдЪреНрдпрд╛ рдУрдЯреНрдпрд╛рд╡рд░ рдХрд╛рдо рдХрд░" тАФ
WORKDIR /app. рдкреБрдврдЪреНрдпрд╛ рд╕рдЧрд│реНрдпрд╛ рдкрд╛рдпрд▒реНрдпрд╛ рддрд┐рдереЗрдЪ рд╣реЛрддрд╛рдд. - "рдЕрдиреНрди рдЖрдд рдареЗрд╡" тАФ
COPY server.js .тАФ рддреБрдордЪреЗ рд╕рд╛рдорд╛рди рдбрдмреНрдпрд╛рдд рдЬрд╛рддреЗ. - "default settings рдЭрд╛рдХрдгрд╛рд╡рд░ рдЪрд┐рдХрдЯрд╡" тАФ
ENV PORT=3000. рдкреБрдиреНрд╣рд╛ рдкреЕрдХ рди рдХрд░рддрд╛ рдЬреЗрд╡рдгрд╛рдЪреНрдпрд╛ рд╡реЗрд│реА рдмрджрд▓рддрд╛ рдпреЗрддрд╛рдд. - "рд▓реЗрдмрд▓рд╡рд░ 'рдЦрд┐рдбрдХреА 3000 рд╡рд░ рдЙрдШрдбрддреЛ' рдЕрд╕реЗ рд▓рд┐рд╣реА" тАФ
EXPOSE 3000. рд╣реЗ рдлрдХреНрдд рдорд╛рдгрд╕рд╛рдВрд╕рд╛рдареАрдЪреЗ рд▓реЗрдмрд▓ рдЖрд╣реЗ тАФ рддреЗ рд╕реНрд╡рддрдГрд╣реВрди рдХрд╛рд╣реАрдЪ рдЙрдШрдбрдд рдирд╛рд╣реА! - "рд╣рд╛ рдбрдмрд╛ рдореБрд▓реАрдЪрд╛ рдЖрд╣реЗ, рдореБрдЦреНрдпрд╛рдзреНрдпрд╛рдкрд┐рдХрд╛рдВрдЪрд╛ рдирд╛рд╣реА" тАФ
USER node. рдбрдмреНрдпрд╛рд▓рд╛ рдЧрд░рдЬ рдирд╕рд▓реЗрд▓реНрдпрд╛ рдорд╣рд╛рд╢рдХреНрддреА рджреЗрдК рдирдХрд╛. - "рдбрдмрд╛ рдЙрдШрдбрд▓реНрдпрд╛рд╡рд░ рдЕрд╕реЗ рдЦрд╛" тАФ
CMD ["node","server.js"]. рдПрдХ рдбрдмрд╛, рдПрдХ рдкрджрд╛рд░реНрде: container foreground рдордзреНрдпреЗ рдПрдХ рдореБрдЦреНрдп process рдЪрд╛рд▓рд╡рддреЛ. рддреА process рд╕рдВрдкрд▓реА рдХреА рдЬреЗрд╡рдг рд╕рдВрдкрд▓реЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
subgraph df["ЁЯУЭ app/Dockerfile"]
f["FROM node:20-alpine"]
w["WORKDIR /app"]
c["COPY server.js ."]
e["ENV PORT=3000 ┬╖ EXPOSE 3000"]
u["USER node"]
cmd["CMD node server.js"]
f --> w --> c --> e --> u --> cmd
end
f -.->|"1 pre-baked base"| f
c -.->|"2 your code enters"| c
e -.->|"3 defaults + label"| e
cmd -.->|"4 what runs on open"| cmd
тЭУ рдХрд╛рдп
FROMтАФ base image (рдиреЗрд╣рдореА version pin рдХрд░рд╛:node:20-alpine, рдХрдзреАрд╣реА рдлрдХреНрддnodeрдирд╛рд╣реА).WORKDIRтАФ рдкреБрдврдЪреНрдпрд╛ рд╕рдЧрд│реНрдпрд╛ рдкрд╛рдпрд▒реНрдпрд╛рдВрд╕рд╛рдареА cd (directory рд╣реА рдмрдирд╡рддреЗ).COPYтАФ build context рдордзреВрди тЖТ image рдордзреНрдпреЗ files..dockerignorecontext рдЧрд╛рд│рддреЗ.RUNтАФ BUILD рд╡реЗрд│реА command рдЪрд╛рд▓рд╡рддреЗ (deps install, compile). рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рддреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА тАФ рд╢реВрдиреНрдп dependencies! рдореЛрдареА ре▓рдкреНрд╕:RUN npm ci.ENVтАФ default env vars, run рд╡реЗрд│реА рдмрджрд▓рддрд╛ рдпреЗрддрд╛рдд (-e).EXPOSEтАФ рдРрдХрдгрд╛рд▒реНрдпрд╛ port рдЪреА рдиреЛрдВрдж (рдЦрд░реЗ рдЙрдШрдбрдгреЗ-pрдиреЗ рд╣реЛрддреЗ, рдзрдбрд╛ 04).USERтАФ process рдХреЛрдгрддрд╛ user рдЪрд╛рд▓рд╡рддреЛ (рдзрдбрд╛ 08: рдХрдзреАрд╣реА root рдирд╛рд╣реА).CMDтАФ рд╕реБрд░реВ рд╣реЛрддрд╛рдирд╛ рдЪрд╛рд▓рдгрд╛рд░реА default command.ENTRYPOINTрд╣рд╛ рддреНрдпрд╛рдЪрд╛ рдЬрд╛рд╕реНрдд рдХрдбрдХ рдЪреБрд▓рддрднрд╛рдК тАФ рдЧрд░рдЬ рдкрдбреЗрд▓ рддреЗрд╡реНрд╣рд╛ рддреНрдпрд╛рдЪреА рдУрд│рдЦ рдХрд░реВрди рдШреНрдпрд╛, рдЖрдзреА рдирд╛рд╣реА.- Build time рд╡рд┐рд░реБрджреНрдз run time рд╣реАрдЪ рдореБрдЦреНрдп рдорд╛рдирд╕рд┐рдХ рд╡рд┐рднрд╛рдЧрдгреА:
RUNbuild рд╡реЗрд│реА рдПрдХрджрд╛рдЪ рдШрдбрддреЗ;CMD/ENVрдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА container рд╕реБрд░реВ рд╣реЛрддрд╛рдирд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЕрд╕рддрд╛рдд.
ЁЯза Instructions рдЪрд╛ рддрдХреНрддрд╛ (рд▓рдЧреЗрдЪ рднреЗрдЯрдгрд╛рд▒реНрдпрд╛ рдЖрда)
| Instruction | рдЙрджреНрджреЗрд╢ | рдХрдзреА рдЪрд╛рд▓рддреЗ |
|---|---|---|
FROM |
base image | build |
WORKDIR |
рдкреБрдврдЪреНрдпрд╛ рдкрд╛рдпрд▒реНрдпрд╛рдВрд╕рд╛рдареА working directory | build |
COPY |
build context рдордзреВрди files copy рдХрд░рдгреЗ | build |
RUN |
command рдЪрд╛рд▓рд╡рдгреЗ (install, compile) | build |
ENV |
environment defaults | build тЖТ run рд╡реЗрд│реА рджрд┐рд╕рддрд╛рдд |
EXPOSE |
container port рдЪреА рдиреЛрдВрдж рдХрд░рддреЗ | (рдлрдХреНрдд metadata) |
USER |
process рдХреЛрдгрддреНрдпрд╛ user рдореНрд╣рдгреВрди рдЪрд╛рд▓рддреЗ | run |
CMD |
default command | run (container start) |
EXPOSEport publish рдХрд░рдд рдирд╛рд╣реА. рдлрдХреНрдд-p host:container(рдзрдбрд╛ 04) рджрд╛рд░ рдЙрдШрдбрддреЗ.EXPOSEрд╣реЗ рдбрдмреНрдпрд╛рд╡рд░рдЪреЗ рд▓реЗрдмрд▓ рдЖрд╣реЗ.
ЁЯдФ рдХрд╛
Dockerfile рдореНрд╣рдгрдЬреЗ рдЪрд╛рд▓рд╡рддрд╛ рдпреЗрдгрд╛рд░реЗ documentation: рддреНрдпрд╛рд╡рд░реВрди рдХреЛрдгреАрд╣реА рддреБрдордЪреЗ рдиреЗрдордХреЗ environment рдкреБрдиреНрд╣рд╛ рдмрд╛рдВрдзреВ рд╢рдХрддреЗ. рдкреНрд░рддреНрдпреЗрдХ CI pipeline (k8s рдХреЛрд░реНрд╕!), рдкреНрд░рддреНрдпреЗрдХ review, рдкреНрд░рддреНрдпреЗрдХ debugging session рдпрд╛рдЪ file рдкрд╛рд╕реВрди рд╕реБрд░реВ рд╣реЛрддреЗ. рддреА рд╕рд╣рдЬ рд╡рд╛рдЪрддрд╛ рдпреЗрдгреЗ рд╣реА рд╕реНрд╡рд╕реНрддрд╛рдд рдорд┐рд│рдгрд╛рд░реА рдорд╣рд╛рд╢рдХреНрддреА рдЖрд╣реЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
app/Dockerfile рдЙрдШрдбрд╛ тАФ рдкреНрд░рддреНрдпреЗрдХ рдУрд│реАрд╡рд░ рдпрд╛ рдзрдбреНрдпрд╛рдЪреЗ comment
рд░реВрдк рдЖрд╣реЗ. рдХрд╛рдп рдирд╛рд╣реА рддреЗрд╣реА рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛: RUN npm install рдирд╛рд╣реА
(deps рдирд╛рд╣реАрдд), secrets рдирд╛рд╣реАрдд (secrets рдХрдзреАрд╣реА рдерд░рд╛рдВрдд bake рдХрд░реВ рдирдХрд╛ тАФ рддреЗ рдХреЗрдХрдордзреНрдпреЗ
рдХрд╛рдпрдордЪреЗ рд░рд╛рд╣рддрд╛рдд, рдзрдбрд╛ 08!).
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
docker build -t hello-school:v1 app/ # bake from the recipe
docker run --rm -p 3000:3000 hello-school:v1 # open the box
curl localhost:3000 # ЁЯН▒ hello from <hostname>
# prove ENV defaults are overridable without rebuilding:
docker run --rm -p 3000:3000 -e APP_VERSION=recipe-test hello-school:v1
curl localhost:3000 # version: recipe-test
# inspect the metadata your Dockerfile wrote:
docker inspect hello-school:v1 --format '{{.Config.User}} {{.Config.Env}} {{.Config.Cmd}}'
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
EXPOSEport publish рдХрд░рдд рдирд╛рд╣реА тАФ-pрдХрд░рддреЛRUNbuild рд╡реЗрд│реА рдШрдбрддреЗ;CMDcontainer рд╕реБрд░реВ рд╣реЛрддрд╛рдирд╛ рдШрдбрддреЗ- pin рди рдХреЗрд▓реЗрд▓реЗ
FROM nodeтАФ рдЙрджреНрдпрд╛ рд╡реЗрдЧрд│рд╛ base, рдЙрджреНрдпрд╛ рд╡реЗрдЧрд│рд╛ bug .dockerignoreрдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдпреЗрдгреНрдпрд╛рдЖрдзреАCOPY . .(рдзрдбрд╛ 08)
тПня╕П рдкреБрдвреЗ
рдбрдмрд╛ рддрдпрд╛рд░ рдЭрд╛рд▓рд╛. рдЖрддрд╛ рддреЛ рдЙрдШрдбрдгреНрдпрд╛рдХрдбреЗ рдЧрд╛рдВрднреАрд░реНрдпрд╛рдиреЗ рд╡рд│реВрдпрд╛: ports, env vars, logs, exec, stop тАФ рд░реЛрдЬрдЪреА рдХреНрд░рд┐рдпрд╛рдкрджреЗ.
git checkout lesson-04-run-containers