ื›ืžื” ื˜ื™ืคื™ื ื›ื™ืฆื“ ืœื”ืื™ืฅ ืืช ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker. ืœื“ื•ื’ืžื”, ืขื“ 30 ืฉื ื™ื•ืช

ืœืคื ื™ ืฉืคื™ืฆ'ืจ ื ื›ื ืก ืœื”ืคืงื”, ื‘ื™ืžื™ื ืืœื” ืฉืœ ืžืชื–ืžืจื™ื ืžื•ืจื›ื‘ื™ื ื•-CI/CD, ื™ืฉ ื“ืจืš ืืจื•ื›ื” ืœืขื‘ื•ืจ ืžื”ืชื—ื™ื™ื‘ื•ืช ืœื‘ื“ื™ืงื•ืช ื•ื”ื’ืฉื”. ื‘ืขื‘ืจ, ื™ื›ื•ืœืช ืœื”ืขืœื•ืช ืงื‘ืฆื™ื ื—ื“ืฉื™ื ื‘ืืžืฆืขื•ืช FTP (ืืฃ ืื—ื“ ืœื ืขื•ืฉื” ืืช ื–ื” ื™ื•ืชืจ, ื ื›ื•ืŸ?), ื•ืชื”ืœื™ืš ื”"ืคืจื™ืกื”" ืœืงื— ืฉื ื™ื•ืช. ื›ืขืช ืขืœื™ืš ืœื™ืฆื•ืจ ื‘ืงืฉืช ืžื™ื–ื•ื’ ื•ืœื”ืžืชื™ืŸ ื–ืžืŸ ืจื‘ ืขื“ ืฉื”ืชื›ื•ื ื” ืชื’ื™ืข ืœืžืฉืชืžืฉื™ื.

ื—ืœืง ืžื”ื ืชื™ื‘ ื”ื–ื” ื”ื•ื ื‘ื ื™ื™ืช ืชืžื•ื ืช Docker. ืœืคืขืžื™ื ื”ื”ืจื›ื‘ื” ื ืžืฉื›ืช ื“ืงื•ืช, ืœืคืขืžื™ื ืขืฉืจื•ืช ื“ืงื•ืช, ืžื” ืฉื‘ืงื•ืฉื™ ื™ื›ื•ืœ ืœื”ื™ืงืจื ื ื•ืจืžืœื™. ื‘ืžืืžืจ ื–ื”, ื ื™ืงื— ื™ื™ืฉื•ื ืคืฉื•ื˜ ืฉื ืืจื•ื– ืœืชืžื•ื ื”, ื ื—ื™ืœ ืžืกืคืจ ืฉื™ื˜ื•ืช ื›ื“ื™ ืœื”ืื™ืฅ ืืช ื”ื‘ื ื™ื™ื”, ื•ื ื‘ื—ืŸ ืืช ื”ื ื™ื•ืื ืกื™ื ืฉืœ ืื•ืคืŸ ื”ืคืขื•ืœื” ืฉืœ ืฉื™ื˜ื•ืช ืืœื•.

ื›ืžื” ื˜ื™ืคื™ื ื›ื™ืฆื“ ืœื”ืื™ืฅ ืืช ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker. ืœื“ื•ื’ืžื”, ืขื“ 30 ืฉื ื™ื•ืช

ื™ืฉ ืœื ื• ื ื™ืกื™ื•ืŸ ื˜ื•ื‘ ื‘ื™ืฆื™ืจื” ื•ืชืžื™ื›ื” ื‘ืืชืจื™ ืžื“ื™ื”: ื˜ืืก, ื‘ืœ, "ืขื™ืชื•ืŸ ื—ื“ืฉ", ืจืคื•ื‘ืœื™ืงื”... ืœืคื ื™ ื–ืžืŸ ืœื ืจื‘ ื”ืจื—ื‘ื ื• ืืช ื”ืคื•ืจื˜ืคื•ืœื™ื• ืฉืœื ื• ืขืœ ื™ื“ื™ ืคืจืกื•ื ืืชืจ ืžื•ืฆืจ ืชื–ื›ื•ืจืช. ื•ื‘ืขื•ื“ ืฉืชื›ื•ื ื•ืช ื—ื“ืฉื•ืช ื ื•ืกืคื• ื‘ืžื”ื™ืจื•ืช ื•ื‘ืื’ื™ื ื™ืฉื ื™ื ืชื•ืงื ื•, ืคืจื™ืกื” ืื™ื˜ื™ืช ื”ืคื›ื” ืœื‘ืขื™ื” ื’ื“ื•ืœื”.

ืื ื• ืคื•ืจืกื™ื ืœ-GitLab. ืื ื—ื ื• ืื•ืกืคื™ื ืชืžื•ื ื•ืช, ื“ื•ื—ืคื™ื ืื•ืชืŸ ืœ-GitLab Registry ื•ืžื’ืœื’ืœื™ื ืื•ืชืŸ ืœื™ื™ืฆื•ืจ. ื”ื“ื‘ืจ ื”ืืจื•ืš ื‘ื™ื•ืชืจ ื‘ืจืฉื™ืžื” ื–ื• ื”ื•ื ื”ืจื›ื‘ืช ืชืžื•ื ื•ืช. ืœื“ื•ื’ืžื”: ืœืœื ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”, ื›ืœ ื‘ื ื™ื™ืช backend ืืจื›ื” 14 ื“ืงื•ืช.

ื›ืžื” ื˜ื™ืคื™ื ื›ื™ืฆื“ ืœื”ืื™ืฅ ืืช ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker. ืœื“ื•ื’ืžื”, ืขื“ 30 ืฉื ื™ื•ืช

ื‘ืกื•ืฃ ื”ืชื‘ืจืจ ืฉืื ื—ื ื• ื›ื‘ืจ ืœื ื™ื›ื•ืœื™ื ืœื—ื™ื•ืช ื›ื›ื”, ื•ื”ืชื™ื™ืฉื‘ื ื• ืœื”ื‘ื™ืŸ ืœืžื” ืœื•ืงื— ื›ืœ ื›ืš ื”ืจื‘ื” ื–ืžืŸ ืœืืกื•ืฃ ืืช ื”ืชืžื•ื ื•ืช. ื›ืชื•ืฆืื” ืžื›ืš, ื”ืฆืœื—ื ื• ืœืฆืžืฆื ืืช ื–ืžืŸ ื”ื”ืจื›ื‘ื” ืœ-30 ืฉื ื™ื•ืช!

ื›ืžื” ื˜ื™ืคื™ื ื›ื™ืฆื“ ืœื”ืื™ืฅ ืืช ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker. ืœื“ื•ื’ืžื”, ืขื“ 30 ืฉื ื™ื•ืช

ืœืžืืžืจ ื–ื”, ื›ื“ื™ ืœื ืœื”ื™ื•ืช ืงืฉื•ืจ ืœืกื‘ื™ื‘ืช Reminder, ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื“ื•ื’ืžื” ืœื”ืจื›ื‘ืช ืืคืœื™ืงืฆื™ื” Angular ืจื™ืงื”. ืื– ื‘ื•ืื• ื ื™ืฆื•ืจ ืืช ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื•:

ng n app

ื”ื•ืกืฃ ืœื–ื” PWA (ืื ื—ื ื• ืžืชืงื“ืžื™ื):

ng add @angular/pwa --project app

ื‘ื–ืžืŸ ืฉื”ื•ืจื“ืช ืžื™ืœื™ื•ืŸ ื—ื‘ื™ืœื•ืช npm, ื‘ื•ืื• ื ื‘ื™ืŸ ืื™ืš ืขื•ื‘ื“ืช ืชืžื•ื ืช ื”-docker. Docker ืžืกืคืง ืืช ื”ื™ื›ื•ืœืช ืœืืจื•ื– ื™ื™ืฉื•ืžื™ื ื•ืœื”ืจื™ืฅ ืื•ืชื ื‘ืกื‘ื™ื‘ื” ืžื‘ื•ื“ื“ืช ื”ื ืงืจืืช ืงื•ื ื˜ื™ื™ื ืจ. ื”ื•ื“ื•ืช ืœื‘ื™ื“ื•ื“, ืืชื” ื™ื›ื•ืœ ืœื”ืคืขื™ืœ ืงื•ื ื˜ื™ื™ื ืจื™ื ืจื‘ื™ื ื‘ื• ื–ืžื ื™ืช ืขืœ ืฉืจืช ืื—ื“. ืงื•ื ื˜ื™ื™ื ืจื™ื ื”ืจื‘ื” ื™ื•ืชืจ ืงืœื™ื ืžืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช ืžื›ื™ื•ื•ืŸ ืฉื”ื ืคื•ืขืœื™ื ื™ืฉื™ืจื•ืช ืขืœ ืœื™ื‘ืช ื”ืžืขืจื›ืช. ื›ื“ื™ ืœื”ืคืขื™ืœ ืงื•ื ื˜ื™ื™ื ืจ ืขื ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื•, ืขืœื™ื ื• ืœื™ืฆื•ืจ ืชื—ื™ืœื” ืชืžื•ื ื” ื‘ื” ื ืืจื•ื– ืืช ื›ืœ ืžื” ืฉืฆืจื™ืš ื›ื“ื™ ืฉื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื• ืชืคืขืœ. ื‘ืขื™ืงืจื• ืฉืœ ื“ื‘ืจ, ืชืžื•ื ื” ื”ื™ื ืขื•ืชืง ืฉืœ ืžืขืจื›ืช ื”ืงื‘ืฆื™ื. ืœื“ื•ื’ืžื”, ืงื— ืืช Dockerfile:

FROM node:12.16.2
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build --prod

Dockerfile ื”ื•ื ืงื‘ื•ืฆื” ืฉืœ ื”ื•ืจืื•ืช; ืขืœ ื™ื“ื™ ื‘ื™ืฆื•ืข ื›ืœ ืื—ื“ ืžื”ื, Docker ื™ืฉืžื•ืจ ืืช ื”ืฉื™ื ื•ื™ื™ื ื‘ืžืขืจื›ืช ื”ืงื‘ืฆื™ื ื•ื™ื›ืกื” ืื•ืชื ืขืœ ื”ืงื•ื“ืžื™ื. ื›ืœ ืฆื•ื•ืช ื™ื•ืฆืจ ืืช ื”ืฉื›ื‘ื” ืฉืœื•. ื•ื”ืชืžื•ื ื” ื”ืžื•ื’ืžืจืช ื”ื™ื ืฉื›ื‘ื•ืช ืžืฉื•ืœื‘ื•ืช ื™ื—ื“.

ืžื” ืฉื—ืฉื•ื‘ ืœื“ืขืช: ื›ืœ ืฉื›ื‘ืช Docker ื™ื›ื•ืœื” ืœืฉืžื•ืจ ื‘ืžื˜ืžื•ืŸ. ืื ืฉื•ื ื“ื‘ืจ ืœื ื”ืฉืชื ื” ืžืื– ื”ื‘ื ื™ื™ื” ื”ืื—ืจื•ื ื”, ืื– ื‘ืžืงื•ื ืœื‘ืฆืข ืืช ื”ืคืงื•ื“ื”, ื”ื“ื•ืงืจ ื™ื™ืงื— ืฉื›ื‘ื” ืžื•ื›ื ื”. ืžื›ื™ื•ื•ืŸ ืฉื”ืขืœื™ื™ื” ื”ืขื™ืงืจื™ืช ื‘ืžื”ื™ืจื•ืช ื”ื‘ื ื™ื™ื” ืชื”ื™ื” ืขืงื‘ ื”ืฉื™ืžื•ืฉ ื‘-cache, ื›ืืฉืจ ืžื•ื“ื“ื™ื ืืช ืžื”ื™ืจื•ืช ื”ื‘ื ื™ื™ื” ื ืฉื™ื ืœื‘ ื‘ืžื™ื•ื—ื“ ืœื‘ื ื™ื™ืช ืชืžื•ื ื” ืขื ืžื˜ืžื•ืŸ ืžื•ื›ืŸ. ืื–, ืฆืขื“ ืื—ืจ ืฆืขื“:

  1. ืื ื• ืžื•ื—ืงื™ื ืืช ื”ืชืžื•ื ื•ืช ื‘ืื•ืคืŸ ืžืงื•ืžื™ ื›ื“ื™ ืฉื”ืจื™ืฆื•ืช ืงื•ื“ืžื•ืช ืœื ื™ืฉืคื™ืขื• ืขืœ ื”ื‘ื“ื™ืงื”.
    docker rmi $(docker images -q)
  2. ืื ื—ื ื• ืžืฉื™ืงื™ื ืืช ื”-build ื‘ืคืขื ื”ืจืืฉื•ื ื”.
    time docker build -t app .
  3. ืื ื• ืžืฉื ื™ื ืืช ื”ืงื•ื‘ืฅ src/index.html - ืื ื• ืžื—ืงื™ื ืืช ืขื‘ื•ื“ืชื• ืฉืœ ืžืชื›ื ืช.
  4. ืื ื—ื ื• ืžืคืขื™ืœื™ื ืืช ื”ื‘ื ื™ื™ื” ื‘ืคืขื ื”ืฉื ื™ื™ื”.
    time docker build -t app .

ืื ื”ืกื‘ื™ื‘ื” ืœื‘ื ื™ื™ืช ืชืžื•ื ื•ืช ืžื•ื’ื“ืจืช ื›ื”ืœื›ื” (ืขื•ื“ ืขืœ ื›ืš ื‘ื”ืžืฉืš), ืื– ื›ืืฉืจ ื”ื‘ื ื™ื™ื” ืชืชื—ื™ืœ, ืœ-Docker ื›ื‘ืจ ืชื”ื™ื” ื—ื‘ื•ืจื” ืฉืœ ืžื˜ืžื•ื ื™ื ืขืœ ื”ืกื™ืคื•ืŸ. ื”ืžืฉื™ืžื” ืฉืœื ื• ื”ื™ื ืœืœืžื•ื“ ื›ื™ืฆื“ ืœื”ืฉืชืžืฉ ื‘ืžื˜ืžื•ืŸ ื›ื“ื™ ืฉื”ื‘ื ื™ื™ื” ืชืขื‘ื•ืจ ืžื”ืจ ื›ื›ืœ ื”ืืคืฉืจ. ืžื›ื™ื•ื•ืŸ ืฉืื ื• ืžื ื™ื—ื™ื ืฉื”ืคืขืœืช ื‘ื ื™ื™ื” ืœืœื ืžื˜ืžื•ืŸ ืžืชืจื—ืฉืช ืจืง ืคืขื ืื—ืช - ื‘ืคืขื ื”ืจืืฉื•ื ื” - ืœื›ืŸ ืื ื• ื™ื›ื•ืœื™ื ืœื”ืชืขืœื ืžื›ืžื” ืื™ื˜ื™ืช ื”ื™ื™ืชื” ื”ืคืขื ื”ืจืืฉื•ื ื”. ื‘ืžื‘ื—ื ื™ื ื—ืฉื•ื‘ื” ืœื ื• ื”ืจื™ืฆื” ื”ืฉื ื™ื™ื” ืฉืœ ื”ื‘ื ื™ื™ื”, ื›ืฉื”ืžื˜ืžื•ื ื™ื ื›ื‘ืจ ืžื—ื•ืžืžื™ื ื•ืื ื—ื ื• ืžื•ื›ื ื™ื ืœืืคื•ืช ืืช ื”ืขื•ื’ื” ืฉืœื ื•. ืขื ื–ืืช, ื›ืžื” ืขืฆื•ืช ื™ืฉืคื™ืขื• ื’ื ืขืœ ื”ืžื‘ื ื” ื”ืจืืฉื•ืŸ.

ื‘ื•ืื• ื ืฉื™ื ืืช ื”-Dockerfile ืฉืชื•ืืจ ืœืขื™ืœ ื‘ืชื™ืงื™ื™ืช ื”ืคืจื•ื™ืงื˜ ื•ื ืชื—ื™ืœ ืืช ื”-build. ื›ืœ ื”ืจื™ืฉื•ืžื™ื ืชืžืฆื™ืชื• ื›ื“ื™ ืœื”ืงืœ ืขืœ ื”ืงืจื™ืื”.

$ time docker build -t app .
Sending build context to Docker daemon 409MB
Step 1/5 : FROM node:12.16.2
Status: Downloaded newer image for node:12.16.2
Step 2/5 : WORKDIR /app
Step 3/5 : COPY . .
Step 4/5 : RUN npm ci
added 1357 packages in 22.47s
Step 5/5 : RUN npm run build --prod
Date: 2020-04-16T19:20:09.664Z - Hash: fffa0fddaa3425c55dd3 - Time: 37581ms
Successfully built c8c279335f46
Successfully tagged app:latest

real 5m4.541s
user 0m0.000s
sys 0m0.000s

ืื ื• ืžืฉื ื™ื ืืช ื”ืชื•ื›ืŸ ืฉืœ src/index.html ื•ืžืคืขื™ืœื™ื ืื•ืชื• ืคืขื ืฉื ื™ื™ื”.

$ time docker build -t app .
Sending build context to Docker daemon 409MB
Step 1/5 : FROM node:12.16.2
Step 2/5 : WORKDIR /app
 ---> Using cache
Step 3/5 : COPY . .
Step 4/5 : RUN npm ci
added 1357 packages in 22.47s
Step 5/5 : RUN npm run build --prod
Date: 2020-04-16T19:26:26.587Z - Hash: fffa0fddaa3425c55dd3 - Time: 37902ms
Successfully built 79f335df92d3
Successfully tagged app:latest

real 3m33.262s
user 0m0.000s
sys 0m0.000s

ื›ื“ื™ ืœืจืื•ืช ืื ื™ืฉ ืœื ื• ืืช ื”ืชืžื•ื ื”, ื”ืคืขืœ ืืช ื”ืคืงื•ื“ื” docker images:

REPOSITORY   TAG      IMAGE ID       CREATED              SIZE
app          latest   79f335df92d3   About a minute ago   1.74GB

ืœืคื ื™ ื”ื‘ื ื™ื™ื”, docker ืœื•ืงื— ืืช ื›ืœ ื”ืงื‘ืฆื™ื ื‘ื”ืงืฉืจ ื”ื ื•ื›ื—ื™ ื•ืฉื•ืœื— ืื•ืชื ืœื“ืžื•ืŸ ืฉืœื• Sending build context to Docker daemon 409MB. ื”ื”ืงืฉืจ ืฉืœ build ืžืฆื•ื™ืŸ ื›ืืจื’ื•ืžื ื˜ ื”ืื—ืจื•ืŸ ืœืคืงื•ื“ืช build. ื‘ืžืงืจื” ืฉืœื ื•, ื–ื• ื”ืกืคืจื™ื™ื” ื”ื ื•ื›ื—ื™ืช - ".", - ื•- Docker ื’ื•ืจืจ ืืช ื›ืœ ืžื” ืฉื™ืฉ ืœื ื• ื‘ืชื™ืงื™ื™ื” ื”ื–ื•. 409 ืžื’ื”-ื‘ื™ื™ื˜ ื–ื” ื”ืจื‘ื”: ื‘ื•ื ื ื—ืฉื•ื‘ ืื™ืš ืœืชืงืŸ ืืช ื–ื”.

ืฆืžืฆื•ื ื”ื”ืงืฉืจ

ื›ื“ื™ ืœืฆืžืฆื ืืช ื”ื”ืงืฉืจ, ื™ืฉ ืฉืชื™ ืืคืฉืจื•ื™ื•ืช. ืœื—ืœื•ืคื™ืŸ, ืฉื™ื ืืช ื›ืœ ื”ืงื‘ืฆื™ื ื”ื“ืจื•ืฉื™ื ืœื”ืจื›ื‘ื” ื‘ืชื™ืงื™ื™ื” ื ืคืจื“ืช ื•ื”ืคื ื” ืืช ื”ืงืฉืจ ื”ื“ื•ืงืจ ืœืชื™ืงื™ื” ื–ื•. ื–ื” ืื•ืœื™ ืœื ืชืžื™ื“ ื ื•ื—, ืื– ืืคืฉืจ ืœืฆื™ื™ืŸ ื—ืจื™ื’ื™ื: ืžื” ืืกื•ืจ ืœื’ืจื•ืจ ืœืชื•ืš ื”ื”ืงืฉืจ. ืœืฉื ื›ืš, ื”ื›ื ืก ืืช ืงื•ื‘ืฅ ื”-docerignore ืœืคืจื•ื™ื™ืงื˜ ื•ืกืžืŸ ืžื” ืœื ื ื—ื•ืฅ ืขื‘ื•ืจ ื”-build:

.git
/node_modules

ื•ื”ืคืขืœ ืืช ื”-build ืฉื•ื‘:

$ time docker build -t app .
Sending build context to Docker daemon 607.2kB
Step 1/5 : FROM node:12.16.2
Step 2/5 : WORKDIR /app
 ---> Using cache
Step 3/5 : COPY . .
Step 4/5 : RUN npm ci
added 1357 packages in 22.47s
Step 5/5 : RUN npm run build --prod
Date: 2020-04-16T19:33:54.338Z - Hash: fffa0fddaa3425c55dd3 - Time: 37313ms
Successfully built 4942f010792a
Successfully tagged app:latest

real 1m47.763s
user 0m0.000s
sys 0m0.000s

607.2 KB ื”ื•ื ื”ืจื‘ื” ื™ื•ืชืจ ื˜ื•ื‘ ืž-409 MB. ื”ืงื˜ื ื• ื’ื ืืช ื’ื•ื“ืœ ื”ืชืžื•ื ื” ืž-1.74 ืœ-1.38 GB:

REPOSITORY   TAG      IMAGE ID       CREATED         SIZE
app          latest   4942f010792a   3 minutes ago   1.38GB

ื‘ื•ืื• ื ื ืกื” ืœื”ืงื˜ื™ืŸ ืืช ื’ื•ื“ืœ ื”ืชืžื•ื ื” ืขื•ื“ ื™ื•ืชืจ.

ืื ื—ื ื• ืžืฉืชืžืฉื™ื ื‘ืืœืคื™ืŸ

ื“ืจืš ื ื•ืกืคืช ืœื—ืกื•ืš ื‘ื’ื•ื“ืœ ื”ืชืžื•ื ื” ื”ื™ื ืœื”ืฉืชืžืฉ ื‘ืชืžื•ื ืช ืื‘ ืงื˜ื ื”. ื”ื“ื™ืžื•ื™ ื”ื”ื•ืจื™ ื”ื•ื ื”ืชืžื•ื ื” ืฉืขืœ ื‘ืกื™ืกื” ืžื›ื™ื ื™ื ืืช ื”ืชืžื•ื ื” ืฉืœื ื•. ื”ืฉื›ื‘ื” ื”ืชื—ืชื•ื ื” ืžื•ื’ื“ืจืช ืขืœ ื™ื“ื™ ื”ืคืงื•ื“ื” FROM ื‘- Dockerfile. ื‘ืžืงืจื” ืฉืœื ื•, ืื ื• ืžืฉืชืžืฉื™ื ื‘ืชืžื•ื ื” ืžื‘ื•ืกืกืช ืื•ื‘ื•ื ื˜ื• ืฉื›ื‘ืจ ื”ื•ืชืงื ื• ื‘ื” ืจื›ื™ื‘ื™ nodej. ื•ื–ื” ืฉื•ืงืœ...

$ docker images -a | grep node
node 12.16.2 406aa3abbc6c 17 minutes ago 916MB

... ื›ืžืขื˜ ื’ื™ื’ื”-ื‘ื™ื™ื˜. ืืชื” ื™ื›ื•ืœ ืœื”ืคื—ื™ืช ืžืฉืžืขื•ืชื™ืช ืืช ืขื•ืฆืžืช ื”ืงื•ืœ ืขืœ ื™ื“ื™ ืฉื™ืžื•ืฉ ื‘ืชืžื•ื ื” ื”ืžื‘ื•ืกืกืช ืขืœ Alpine Linux. Alpine ื”ื•ื ืœื™ื ื•ืงืก ืงื˜ืŸ ืžืื•ื“. ืชืžื•ื ืช ื”ื“ื•ืงืจ ืขื‘ื•ืจ nodejs ื”ืžื‘ื•ืกืกืช ืขืœ ืืœืคื™ื™ืŸ ืฉื•ืงืœืช ืจืง 88.5 ืžื’ื”-ื‘ื™ื™ื˜. ืื– ื‘ื•ืื• ื ื—ืœื™ืฃ ืืช ื”ืชื“ืžื™ืช ื”ืชื•ืกืกืช ืฉืœื ื• ื‘ื‘ืชื™ื:

FROM node:12.16.2-alpine3.11
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build --prod

ื”ื™ื™ื ื• ืฆืจื™ื›ื™ื ืœื”ืชืงื™ืŸ ื›ืžื” ื“ื‘ืจื™ื ื”ื“ืจื•ืฉื™ื ืœื‘ื ื™ื™ืช ื”ืืคืœื™ืงืฆื™ื”. ื›ืŸ, Angular ืœื ื‘ื•ื ื” ื‘ืœื™ Python ยฏ(ยฐ_o)/ยฏ

ืื‘ืœ ื’ื•ื“ืœ ื”ืชืžื•ื ื” ื™ืจื“ ืœ-150 MB:

REPOSITORY   TAG      IMAGE ID       CREATED          SIZE
app          latest   aa031edc315a   22 minutes ago   761MB

ื‘ื•ืื• ื ืœืš ืืคื™ืœื• ืจื—ื•ืง ื™ื•ืชืจ.

ื”ืจื›ื‘ื” ืจื‘ ืฉืœื‘ื™ืช

ืœื ื›ืœ ืžื” ืฉื ืžืฆื ื‘ืชืžื•ื ื” ื”ื•ื ืžื” ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ื‘ื”ืคืงื”.

$ docker run app ls -lah
total 576K
drwxr-xr-x 1 root root 4.0K Apr 16 19:54 .
drwxr-xr-x 1 root root 4.0K Apr 16 20:00 ..
-rwxr-xr-x 1 root root 19 Apr 17 2020 .dockerignore
-rwxr-xr-x 1 root root 246 Apr 17 2020 .editorconfig
-rwxr-xr-x 1 root root 631 Apr 17 2020 .gitignore
-rwxr-xr-x 1 root root 181 Apr 17 2020 Dockerfile
-rwxr-xr-x 1 root root 1020 Apr 17 2020 README.md
-rwxr-xr-x 1 root root 3.6K Apr 17 2020 angular.json
-rwxr-xr-x 1 root root 429 Apr 17 2020 browserslist
drwxr-xr-x 3 root root 4.0K Apr 16 19:54 dist
drwxr-xr-x 3 root root 4.0K Apr 17 2020 e2e
-rwxr-xr-x 1 root root 1015 Apr 17 2020 karma.conf.js
-rwxr-xr-x 1 root root 620 Apr 17 2020 ngsw-config.json
drwxr-xr-x 1 root root 4.0K Apr 16 19:54 node_modules
-rwxr-xr-x 1 root root 494.9K Apr 17 2020 package-lock.json
-rwxr-xr-x 1 root root 1.3K Apr 17 2020 package.json
drwxr-xr-x 5 root root 4.0K Apr 17 2020 src
-rwxr-xr-x 1 root root 210 Apr 17 2020 tsconfig.app.json
-rwxr-xr-x 1 root root 489 Apr 17 2020 tsconfig.json
-rwxr-xr-x 1 root root 270 Apr 17 2020 tsconfig.spec.json
-rwxr-xr-x 1 root root 1.9K Apr 17 2020 tslint.json

ืขื docker run app ls -lah ื”ืฉืงื ื• ืžื™ื›ืœ ื”ืžื‘ื•ืกืก ืขืœ ื”ืชืžื•ื ื” ืฉืœื ื• app ื•ื‘ื™ืฆืข ื‘ื• ืืช ื”ืคืงื•ื“ื” ls -lah, ื•ืœืื—ืจ ืžื›ืŸ ื”ืฉืœื™ืžื” ื”ืžื›ื•ืœื” ืืช ืขื‘ื•ื“ืชื”.

ื‘ื™ื™ืฆื•ืจ ืื ื—ื ื• ืฆืจื™ื›ื™ื ืจืง ืชื™ืงื™ื™ื” dist. ื‘ืžืงืจื” ื–ื”, ืื™ื›ืฉื”ื• ืฆืจื™ืš ืœืชืช ืืช ื”ืงื‘ืฆื™ื ื‘ื—ื•ืฅ. ืืชื” ื™ื›ื•ืœ ืœื”ืคืขื™ืœ ืฉืจืช HTTP ื›ืœืฉื”ื• ื‘-nodejs. ืื‘ืœ ืื ื—ื ื• ื ืขืฉื” ืืช ื–ื” ื™ื•ืชืจ ืงืœ. ื ื—ืฉื• ืžื™ืœื” ืจื•ืกื™ืช ืฉื™ืฉ ืœื” ืืจื‘ืข ืื•ืชื™ื•ืช "y". ื™ืžื™ืŸ! Ynzhynyksy. ื‘ื•ืื• ื ื™ืงื— ืชืžื•ื ื” ืขื nginx, ื ื›ื ื™ืก ืœืชื•ื›ื” ืชื™ืงื™ื” dist ื•ืชืฆื•ืจื” ืงื˜ื ื”:

server {
    listen 80 default_server;
    server_name localhost;
    charset utf-8;
    root /app/dist;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

ื‘ื ื™ื™ื” ืžืจื•ื‘ื” ืฉืœื‘ื™ื ืชืขื–ื•ืจ ืœื ื• ืœืขืฉื•ืช ืืช ื›ืœ ื–ื”. ื‘ื•ืื• ื ืฉื ื” ืืช ื”-Dockerfile ืฉืœื ื•:

FROM node:12.16.2-alpine3.11 as builder
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build --prod

FROM nginx:1.17.10-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/static.conf /etc/nginx/conf.d
COPY --from=builder /app/dist/app .

ืขื›ืฉื™ื• ื™ืฉ ืœื ื• ืฉืชื™ ื”ื•ืจืื•ืช FROM ื‘-Dockerfile, ื›ืœ ืื—ื“ ืžื”ื ืžืจื™ืฅ ืฉืœื‘ ื‘ื ื™ื™ื” ืฉื•ื ื”. ื”ืชืงืฉืจื ื• ืœืจืืฉื•ืŸ builder, ืื‘ืœ ื”ื—ืœ ืžื”-FROM ื”ืื—ืจื•ืŸ, ื”ืชืžื•ื ื” ื”ืกื•ืคื™ืช ืฉืœื ื• ืชื•ื›ื ื”. ื”ืฉืœื‘ ื”ืื—ืจื•ืŸ ื”ื•ื ืœื”ืขืชื™ืง ืืช ื”ื—ืคืฅ ืฉืœ ื”ื”ืจื›ื‘ื” ืฉืœื ื• ื‘ืฉืœื‘ ื”ืงื•ื“ื ืœืชืžื•ื ื” ื”ืกื•ืคื™ืช ืขื nginx. ื’ื•ื“ืœ ื”ืชืžื•ื ื” ื™ืจื“ ืžืฉืžืขื•ืชื™ืช:

REPOSITORY   TAG      IMAGE ID       CREATED          SIZE
app          latest   2c6c5da07802   29 minutes ago   36MB

ื‘ื•ืื• ื ืจื™ืฅ ืืช ื”ืงื•ื ื˜ื™ื™ื ืจ ืขื ื”ืชืžื•ื ื” ืฉืœื ื• ื•ื ื•ื•ื“ื ืฉื”ื›ืœ ืขื•ื‘ื“:

docker run -p8080:80 app

ื‘ืืžืฆืขื•ืช ื”ืืคืฉืจื•ืช -p8080:80, ื”ืขื‘ืจื ื• ืืช ื™ืฆื™ืื” 8080 ื‘ืžื—ืฉื‘ ื”ืžืืจื— ืฉืœื ื• ืœื™ืฆื™ืื” 80 ื‘ืชื•ืš ื”ืงื•ื ื˜ื™ื™ื ืจ ืฉื‘ื• ืคื•ืขืœ nginx. ืคืชื•ื— ื‘ื“ืคื“ืคืŸ http://localhost:8080/ ื•ืื ื—ื ื• ืจื•ืื™ื ืืช ื”ื‘ืงืฉื” ืฉืœื ื•. ื”ื›ืœ ืขื•ื‘ื“!

ื›ืžื” ื˜ื™ืคื™ื ื›ื™ืฆื“ ืœื”ืื™ืฅ ืืช ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker. ืœื“ื•ื’ืžื”, ืขื“ 30 ืฉื ื™ื•ืช

ื”ืงื˜ื ืช ื’ื•ื“ืœ ื”ืชืžื•ื ื” ืž-1.74 ื’'ื™ื’ื”-ื‘ื™ื™ื˜ ืœ-36 ืžื’ื”-ื‘ื™ื™ื˜ ืžืคื—ื™ืชื” ืžืฉืžืขื•ืชื™ืช ืืช ื”ื–ืžืŸ ืฉืœื•ืงื— ืœืกืคืง ืืช ื”ืืคืœื™ืงืฆื™ื” ืฉืœืš ืœื™ื™ืฆื•ืจ. ืื‘ืœ ื‘ื•ืื• ื ื—ื–ื•ืจ ืœื–ืžืŸ ื”ื”ืจื›ื‘ื”.

$ time docker build -t app .
Sending build context to Docker daemon 608.8kB
Step 1/11 : FROM node:12.16.2-alpine3.11 as builder
Step 2/11 : RUN apk --no-cache --update --virtual build-dependencies add python make g++
 ---> Using cache
Step 3/11 : WORKDIR /app
 ---> Using cache
Step 4/11 : COPY . .
Step 5/11 : RUN npm ci
added 1357 packages in 47.338s
Step 6/11 : RUN npm run build --prod
Date: 2020-04-16T21:16:03.899Z - Hash: fffa0fddaa3425c55dd3 - Time: 39948ms
 ---> 27f1479221e4
Step 7/11 : FROM nginx:stable-alpine
Step 8/11 : WORKDIR /app
 ---> Using cache
Step 9/11 : RUN rm /etc/nginx/conf.d/default.conf
 ---> Using cache
Step 10/11 : COPY nginx/static.conf /etc/nginx/conf.d
 ---> Using cache
Step 11/11 : COPY --from=builder /app/dist/app .
Successfully built d201471c91ad
Successfully tagged app:latest

real 2m17.700s
user 0m0.000s
sys 0m0.000s

ืฉื™ื ื•ื™ ืกื“ืจ ื”ืฉื›ื‘ื•ืช

ืฉืœื•ืฉืช ื”ืฆืขื“ื™ื ื”ืจืืฉื•ื ื™ื ืฉืœื ื• ื ืฉืžืจื• ื‘ืžื˜ืžื•ืŸ (ืจืžื– Using cache). ื‘ืฉืœื‘ ื”ืจื‘ื™ืขื™, ื›ืœ ืงื‘ืฆื™ ื”ืคืจื•ื™ืงื˜ ืžื•ืขืชืงื™ื ื•ื‘ืฉืœื‘ ื”ื—ืžื™ืฉื™ ืžื•ืชืงื ื•ืช ืชืœื•ืช RUN npm ci - ืขื“ 47.338 ืฉื ื™ื•ืช. ืœืžื” ืœื”ืชืงื™ืŸ ืžื—ื“ืฉ ืชืœื•ืช ื‘ื›ืœ ืคืขื ืื ื”ื ืžืฉืชื ื™ื ืœืขืชื™ื ืจื—ื•ืงื•ืช ืžืื•ื“? ื‘ื•ืื• ื ื‘ื™ืŸ ืœืžื” ื”ื ืœื ื ืฉืžืจื• ื‘ืžื˜ืžื•ืŸ. ื”ื ืงื•ื“ื” ื”ื™ื ืฉ-Docker ื™ื‘ื“ื•ืง ืฉื›ื‘ื” ืื—ืจ ืฉื›ื‘ื” ื›ื“ื™ ืœืจืื•ืช ืื ื”ืคืงื•ื“ื” ื•ื”ืงื‘ืฆื™ื ื”ืžืฉื•ื™ื›ื™ื ืืœื™ื” ื”ืฉืชื ื•. ื‘ืฉืœื‘ ื”ืจื‘ื™ืขื™, ืื ื• ืžืขืชื™ืงื™ื ืืช ื›ืœ ื”ืงื‘ืฆื™ื ืฉืœ ื”ืคืจื•ื™ืงื˜ ืฉืœื ื•, ื•ื‘ื™ื ื™ื”ื, ื›ืžื•ื‘ืŸ, ื™ืฉื ื ืฉื™ื ื•ื™ื™ื, ื›ืš ืฉ-Docker ืœื ืจืง ืฉืœื ืœื•ืงื— ืืช ื”ืฉื›ื‘ื” ื”ื–ื• ืžื”ืžื˜ืžื•ืŸ, ืืœื ื’ื ืืช ื›ืœ ื”ืงื‘ืฆื™ื ื”ื‘ืื™ื! ื‘ื•ืื• ื ืขืฉื” ื›ืžื” ืฉื™ื ื•ื™ื™ื ืงื˜ื ื™ื ื‘- Dockerfile.

FROM node:12.16.2-alpine3.11 as builder
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build --prod

FROM nginx:1.17.10-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/static.conf /etc/nginx/conf.d
COPY --from=builder /app/dist/app .

ืจืืฉื™ืช, package.json ื•-package-lock.json ืžื•ืขืชืงื™ื, ืœืื—ืจ ืžื›ืŸ ืžื•ืชืงื ื™ื ืชืœื•ืช, ื•ืจืง ืœืื—ืจ ืžื›ืŸ ื›ืœ ื”ืคืจื•ื™ื™ืงื˜ ืžื•ืขืชืง. ื›ืชื•ืฆืื”:

$ time docker build -t app .
Sending build context to Docker daemon 608.8kB
Step 1/12 : FROM node:12.16.2-alpine3.11 as builder
Step 2/12 : RUN apk --no-cache --update --virtual build-dependencies add python make g++
 ---> Using cache
Step 3/12 : WORKDIR /app
 ---> Using cache
Step 4/12 : COPY package*.json ./
 ---> Using cache
Step 5/12 : RUN npm ci
 ---> Using cache
Step 6/12 : COPY . .
Step 7/12 : RUN npm run build --prod
Date: 2020-04-16T21:29:44.770Z - Hash: fffa0fddaa3425c55dd3 - Time: 38287ms
 ---> 1b9448c73558
Step 8/12 : FROM nginx:stable-alpine
Step 9/12 : WORKDIR /app
 ---> Using cache
Step 10/12 : RUN rm /etc/nginx/conf.d/default.conf
 ---> Using cache
Step 11/12 : COPY nginx/static.conf /etc/nginx/conf.d
 ---> Using cache
Step 12/12 : COPY --from=builder /app/dist/app .
Successfully built a44dd7c217c3
Successfully tagged app:latest

real 0m46.497s
user 0m0.000s
sys 0m0.000s

46 ืฉื ื™ื•ืช ื‘ืžืงื•ื 3 ื“ืงื•ืช - ื”ืจื‘ื” ื™ื•ืชืจ ื˜ื•ื‘! ื”ืกื“ืจ ื”ื ื›ื•ืŸ ืฉืœ ื”ืฉื›ื‘ื•ืช ื—ืฉื•ื‘: ืจืืฉื™ืช ื ืขืชื™ืง ืืช ืžื” ืฉืœื ืžืฉืชื ื”, ืื—ืจ ื›ืš ืืช ืžื” ืฉืžืฉืชื ื” ืœืขื™ืชื™ื ืจื—ื•ืงื•ืช, ื•ืœื‘ืกื•ืฃ ืืช ืžื” ืฉืžืฉืชื ื” ืœืขื™ืชื™ื ืงืจื•ื‘ื•ืช.

ืœืื—ืจ ืžื›ืŸ, ื›ืžื” ืžื™ืœื™ื ืขืœ ื”ืจื›ื‘ืช ืชืžื•ื ื•ืช ื‘ืžืขืจื›ื•ืช CI/CD.

ืฉื™ืžื•ืฉ ื‘ืชืžื•ื ื•ืช ืงื•ื“ืžื•ืช ืœืžื˜ืžื•ืŸ

ืื ื ืฉืชืžืฉ ื‘ืคืชืจื•ืŸ SaaS ื›ืœืฉื”ื• ืขื‘ื•ืจ ื”ื‘ื ื™ื™ื”, ื™ื™ืชื›ืŸ ืฉื”ืžื˜ืžื•ืŸ ื”ืžืงื•ืžื™ ืฉืœ Docker ื™ื”ื™ื” ื ืงื™ ื•ืจืขื ืŸ. ื›ื“ื™ ืœืชืช ืœื“ื•ืงืจ ืžืงื•ื ืœืงื‘ืœ ืืช ื”ืฉื›ื‘ื•ืช ื”ืืคื•ื™ื•ืช, ืชื ื• ืœื• ืืช ื”ืชืžื•ื ื” ื”ื‘ื ื•ื™ื” ื”ืงื•ื“ืžืช.

ื‘ื•ืื• ื ื™ืงื— ื“ื•ื’ืžื” ืœื‘ื ื™ื™ืช ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื• ื‘-GitHub Actions. ืื ื• ืžืฉืชืžืฉื™ื ื‘ืชืฆื•ืจื” ื–ื•

on:
  push:
    branches:
      - master

name: Test docker build

jobs:
  deploy:
    name: Build
    runs-on: ubuntu-latest
    env:
      IMAGE_NAME: docker.pkg.github.com/${{ github.repository }}/app
      IMAGE_TAG: ${{ github.sha }}

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Login to GitHub Packages
      env:
        TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        docker login docker.pkg.github.com -u $GITHUB_ACTOR -p $TOKEN

    - name: Build
      run: |
        docker build 
          -t $IMAGE_NAME:$IMAGE_TAG 
          -t $IMAGE_NAME:latest 
          .

    - name: Push image to GitHub Packages
      run: |
        docker push $IMAGE_NAME:latest
        docker push $IMAGE_NAME:$IMAGE_TAG

    - name: Logout
      run: |
        docker logout docker.pkg.github.com

ื”ืชืžื•ื ื” ืžื•ืจื›ื‘ืช ื•ื ื“ื—ืคืช ืœื—ื‘ื™ืœื•ืช GitHub ืชื•ืš ืฉืชื™ ื“ืงื•ืช ื•-20 ืฉื ื™ื•ืช:

ื›ืžื” ื˜ื™ืคื™ื ื›ื™ืฆื“ ืœื”ืื™ืฅ ืืช ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker. ืœื“ื•ื’ืžื”, ืขื“ 30 ืฉื ื™ื•ืช

ืขื›ืฉื™ื• ื‘ื•ืื• ื ืฉื ื” ืืช ื”ืžื‘ื ื” ื›ืš ืฉื™ืฉืžืฉ ืžื˜ืžื•ืŸ ืขืœ ืกืžืš ืชืžื•ื ื•ืช ืฉื ื‘ื ื• ื‘ืขื‘ืจ:

on:
  push:
    branches:
      - master

name: Test docker build

jobs:
  deploy:
    name: Build
    runs-on: ubuntu-latest
    env:
      IMAGE_NAME: docker.pkg.github.com/${{ github.repository }}/app
      IMAGE_TAG: ${{ github.sha }}

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Login to GitHub Packages
      env:
        TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        docker login docker.pkg.github.com -u $GITHUB_ACTOR -p $TOKEN

    - name: Pull latest images
      run: |
        docker pull $IMAGE_NAME:latest || true
        docker pull $IMAGE_NAME-builder-stage:latest || true

    - name: Images list
      run: |
        docker images

    - name: Build
      run: |
        docker build 
          --target builder 
          --cache-from $IMAGE_NAME-builder-stage:latest 
          -t $IMAGE_NAME-builder-stage 
          .
        docker build 
          --cache-from $IMAGE_NAME-builder-stage:latest 
          --cache-from $IMAGE_NAME:latest 
          -t $IMAGE_NAME:$IMAGE_TAG 
          -t $IMAGE_NAME:latest 
          .

    - name: Push image to GitHub Packages
      run: |
        docker push $IMAGE_NAME-builder-stage:latest
        docker push $IMAGE_NAME:latest
        docker push $IMAGE_NAME:$IMAGE_TAG

    - name: Logout
      run: |
        docker logout docker.pkg.github.com

ืจืืฉื™ืช ืขืœื™ื ื• ืœืกืคืจ ืœืš ืžื“ื•ืข ืžื•ืคืขืœื•ืช ืฉืชื™ ืคืงื•ื“ื•ืช build. ื”ืขื•ื‘ื“ื” ื”ื™ื ืฉื‘ื”ืจื›ื‘ื” ืจื‘-ืฉืœื‘ื™ืช ื”ืชืžื•ื ื” ืฉืชืชืงื‘ืœ ืชื”ื™ื” ืงื‘ื•ืฆื” ืฉืœ ืฉื›ื‘ื•ืช ืžื”ืฉืœื‘ ื”ืื—ืจื•ืŸ. ื‘ืžืงืจื” ื–ื”, ืฉื›ื‘ื•ืช ืžืฉื›ื‘ื•ืช ืงื•ื“ืžื•ืช ืœื ื™ื™ื›ืœืœื• ื‘ืชืžื•ื ื”. ืœื›ืŸ, ื‘ืขืช ืฉื™ืžื•ืฉ ื‘ืชืžื•ื ื” ื”ืกื•ืคื™ืช ืžื‘ื ื™ื™ื” ืงื•ื“ืžืช, Docker ืœื ื™ื•ื›ืœ ืœืžืฆื•ื ืฉื›ื‘ื•ืช ืžื•ื›ื ื•ืช ืœื‘ื ื™ื™ืช ื”ืชืžื•ื ื” ืขื nodejs (ืฉืœื‘ ื”ื‘ื•ื ื”). ืขืœ ืžื ืช ืœืคืชื•ืจ ื‘ืขื™ื” ื–ื• ื ื•ืฆืจืช ืชืžื•ื ืช ื‘ื™ื ื™ื™ื $IMAGE_NAME-builder-stage ื•ื”ื•ื ื ื“ื—ืฃ ืœื—ื‘ื™ืœื•ืช GitHub ื›ืš ืฉื ื™ืชืŸ ื™ื”ื™ื” ืœื”ืฉืชืžืฉ ื‘ื• ื‘ื‘ื ื™ื™ื” ื”ื‘ืื” ื›ืžืงื•ืจ ืžื˜ืžื•ืŸ.

ื›ืžื” ื˜ื™ืคื™ื ื›ื™ืฆื“ ืœื”ืื™ืฅ ืืช ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker. ืœื“ื•ื’ืžื”, ืขื“ 30 ืฉื ื™ื•ืช

ื–ืžืŸ ื”ื”ืจื›ื‘ื” ื”ื›ื•ืœืœ ืฆื•ืžืฆื ืœื“ืงื” ื•ื—ืฆื™. ื—ืฆื™ ื“ืงื” ืžื•ืฉืงืขืช ื‘ื”ืขืœืืช ืชืžื•ื ื•ืช ืงื•ื“ืžื•ืช.

ื”ื“ืžื™ื” ืžื•ืงื“ืžืช

ื“ืจืš ื ื•ืกืคืช ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ืฉืœ ืžื˜ืžื•ืŸ Docker ื ืงื™ ื”ื™ื ืœื”ืขื‘ื™ืจ ื—ืœืง ืžื”ืฉื›ื‘ื•ืช ืœืชื•ืš Dockerfile ืื—ืจ, ืœื‘ื ื•ืช ืื•ืชื• ื‘ื ืคืจื“, ืœื“ื—ื•ืฃ ืื•ืชื• ืœ-Container Registry ื•ืœื”ืฉืชืžืฉ ื‘ื• ื›ื”ื•ืจื”.

ืื ื• ื™ื•ืฆืจื™ื ืชืžื•ื ืช nodejs ืžืฉืœื ื• ื›ื“ื™ ืœื‘ื ื•ืช ื™ื™ืฉื•ื Angular. ืฆื•ืจ Dockerfile.node ื‘ืคืจื•ื™ืงื˜

FROM node:12.16.2-alpine3.11
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++

ืื ื• ืื•ืกืคื™ื ื•ื“ื•ื—ืคื™ื ืชืžื•ื ื” ืฆื™ื‘ื•ืจื™ืช ื‘-Docker Hub:

docker build -t exsmund/node-for-angular -f Dockerfile.node .
docker push exsmund/node-for-angular:latest

ื›ืขืช ื‘- Dockerfile ื”ืจืืฉื™ ืฉืœื ื• ืื ื• ืžืฉืชืžืฉื™ื ื‘ืชืžื•ื ื” ื”ืžื•ื’ืžืจืช:

FROM exsmund/node-for-angular:latest as builder
...

ื‘ื“ื•ื’ืžื” ืฉืœื ื•, ื–ืžืŸ ื”ื‘ื ื™ื™ื” ืœื ื™ืจื“, ืื‘ืœ ืชืžื•ื ื•ืช ืฉื ื‘ื ื• ืžืจืืฉ ื™ื›ื•ืœื•ืช ืœื”ื™ื•ืช ืฉื™ืžื•ืฉื™ื•ืช ืื ื™ืฉ ืœืš ื”ืจื‘ื” ืคืจื•ื™ืงื˜ื™ื ื•ืืชื” ืฆืจื™ืš ืœื”ืชืงื™ืŸ ืืช ืื•ืชืŸ ื”ืชืœื•ืช ื‘ื›ืœ ืื—ื“ ืžื”ื.

ื›ืžื” ื˜ื™ืคื™ื ื›ื™ืฆื“ ืœื”ืื™ืฅ ืืช ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Docker. ืœื“ื•ื’ืžื”, ืขื“ 30 ืฉื ื™ื•ืช

ื‘ื“ืงื ื• ืžืกืคืจ ืฉื™ื˜ื•ืช ืœื”ืืฆืช ื‘ื ื™ื™ืช ืชืžื•ื ื•ืช docker. ืื ืืชื” ืจื•ืฆื” ืฉื”ืคืจื™ืกื” ืชืขื‘ื•ืจ ื‘ืžื”ื™ืจื•ืช, ื ืกื” ืœื”ืฉืชืžืฉ ื‘ื–ื” ื‘ืคืจื•ื™ืงื˜ ืฉืœืš:

  • ื”ืคื—ืชืช ื”ืงืฉืจ;
  • ืฉื™ืžื•ืฉ ื‘ืชืžื•ื ื•ืช ื”ื•ืจื” ืงื˜ื ื•ืช;
  • ื”ืจื›ื‘ื” ืจื‘-ืฉืœื‘ื™ืช;
  • ืฉื™ื ื•ื™ ืกื“ืจ ื”ื”ื•ืจืื•ืช ื‘- Dockerfile ื›ื“ื™ ืœืขืฉื•ืช ืฉื™ืžื•ืฉ ื™ืขื™ืœ ื‘ืžื˜ืžื•ืŸ;
  • ื”ื’ื“ืจืช ืžื˜ืžื•ืŸ ื‘ืžืขืจื›ื•ืช CI/CD;
  • ื™ืฆื™ืจื” ืจืืฉื•ื ื™ืช ืฉืœ ืชืžื•ื ื•ืช.

ืื ื™ ืžืงื•ื•ื” ืฉื”ื“ื•ื’ืžื” ืชื‘ื”ื™ืจ ื™ื•ืชืจ ืื™ืš Docker ืขื•ื‘ื“, ื•ืชื•ื›ืœ ืœื”ื’ื“ื™ืจ ื‘ืฆื•ืจื” ืื•ืคื˜ื™ืžืœื™ืช ืืช ื”ืคืจื™ืกื” ืฉืœืš. ืขืœ ืžื ืช ืœืฉื—ืง ืขื ื”ื“ื•ื’ืžืื•ืช ืžื”ืžืืžืจ, ื ื•ืฆืจ ืžืื’ืจ https://github.com/devopsprodigy/test-docker-build.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”