
рдЬрдм рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рд╣рдореЗрд╢рд╛ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рд╣реИред рдЫрд╡рд┐рдпрд╛рдВ рдЬреЛ рд╕рдорд╛рди рдкрд░рддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ рдФрд░ рдХрдо рд╡рдЬрди рдХрд░рддреА рд╣реИрдВ - рдЕрдзрд┐рдХ рддреЗрдЬрд╝реА рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдФрд░ рддреИрдирд╛рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЬрдм RUN
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд╖реНрдкрд╛рджрди рдПрдХ рдирдИ рдкрд░рдд рдмрдирд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдХрд╛рд░ рдХреЛ рдХреИрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЕрднреА рднреА рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдордзреНрдпрд╡рд░реНрддреА рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреА рдЬрд░реВрд░рдд рд╣реИ ...
рдЖрдк рд╢рд╛рдпрдж рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдбреЙрдХрд░реЛрдВ рдХреА рдлрд╛рдЗрд▓реЛрдВ рдХреА рдЕрдкрдиреА рдЕрдЬреАрдм рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
FROM ubuntu RUN apt-get update && apt-get install vim
рдЕрдЪреНрдЫрд╛, рдпрд╣рд╛рдБ &&
рдХреНрдпреЛрдВ рд╣реИ? рдХреНрдпрд╛ рдпрд╣рд╛рдВ рджреЛ RUN
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЪрд▓рд╛рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ?
FROM ubuntu RUN apt-get update RUN apt-get install vim
рдбреЙрдХрд░ рд╕рдВрд╕реНрдХрд░рдг 1.10 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░ COPY
, ADD
рдФрд░ RUN
рдСрдкрд░реЗрдЯрд░ рдЫрд╡рд┐ рдореЗрдВ рдПрдХ рдирдИ рдкрд░рдд рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рдХреЗ рдмрдЬрд╛рдп рджреЛ рдкрд░рддреЗрдВ рдмрдирд╛рдИ рдЧрдИ рдереАрдВред

рдЧрд┐рдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рддреЗрдВред
рдбреЙрдХрд░ рдкрд░рддреЗрдВ рдЫрд╡рд┐ рдХреЗ рдкрд┐рдЫрд▓реЗ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреА рд╣реИрдВред рдФрд░ рдЬреИрд╕реЗ рдХрд┐ рдХрдорд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рд╡реЗ рдЖрд╕рд╛рди рд╣реЛрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдпрд╛ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрдм рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╕реЗ рдПрдХ рдЫрд╡рд┐ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рд▓рд╛рдкрддрд╛ рдкрд░рддреЗрдВ рд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЬреЛ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдмреАрдЪ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдЕрд▓рдЧрд╛рд╡ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкрд░рдд рд╣реЛрддреА рд╣реИ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХ, рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдХреЛ рднрд╛рд░реАред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕рдорд╛рди рд╣реИрдВ: рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдЖрдХрд╛рд░ рдкрд░рддреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдмрдврд╝рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдХрдорд┐рдЯреНрд╕ рдХреЗ рдмреАрдЪ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрдИ RUN
рдХрдердиреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реБрдЖ рдХрд░рддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЕрдм, рдЕрдлрд╕реЛрд╕, рдирд╣реАрдВред
1. рдбреЛрдХрд░-рдЪрд┐рддреНрд░реЛрдВ рдХреА рдЪрд░рдгрдмрджреНрдз рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рдкрд░рддреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдорд┐рд▓рд╛рдПрдВ
рдЬрдм Git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдмрдврд╝рддреА рд╣реИ, рддреЛ рдЖрдк рдкреВрд░реЗ рдмрджрд▓рд╛рд╡ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рдПрдХ рдкреНрд░рддрд┐рдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдбреЙрдХрд░ рдореЗрдВ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЪрд░рдгрдмрджреНрдз рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред
рдЪрд▓реЛ рдПрдХ Node.js. рдХрдВрдЯреЗрдирд░ рдмрдирд╛рддреЗ рд╣реИрдВ
index.js
рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
const express = require('express') const app = express() app.get('/', (req, res) => res.send('Hello World!')) app.listen(3000, () => { console.log(`Example app listening on port 3000!`) })
рдФрд░ package.json
:
{ "name": "hello-world", "version": "1.0.0", "main": "index.js", "dependencies": { "express": "^4.16.2" }, "scripts": { "start": "node index.js" } }
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд Dockerfile
рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреИрдХ рдХрд░реЗрдВ:
FROM node:8 EXPOSE 3000 WORKDIR /app COPY package.json index.js ./ RUN npm install CMD ["npm", "start"]
рдПрдХ рдЪрд┐рддреНрд░ рдмрдирд╛рдПрдБ:
$ docker build -t node-vanilla .
рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
$ docker run -p 3000:3000 -ti --rm --init node-vanilla
рдЕрдм рдЖрдк рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: http: // localhost: 3000 рдФрд░ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб!" рджреЗрдЦреЗрдВред
Dockerfile
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Dockerfile
рдФрд░ RUN
рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдореВрд▓ рдЫрд╡рд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рджреЛ рдкрд░рддреЛрдВ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ:
$ docker history node-vanilla IMAGE CREATED BY SIZE 075d229d3f48 /bin/sh -c #(nop) CMD ["npm" "start"] 0B bc8c3cc813ae /bin/sh -c npm install 2.91MB bac31afb6f42 /bin/sh -c #(nop) COPY multi:3071ddd474429e1тАж 364B 500a9fbef90e /bin/sh -c #(nop) WORKDIR /app 0B 78b28027dfbf /bin/sh -c #(nop) EXPOSE 3000 0B b87c2ad8344d /bin/sh -c #(nop) CMD ["node"] 0B <missing> /bin/sh -c set -ex && for key in 6A010тАж 4.17MB <missing> /bin/sh -c #(nop) ENV YARN_VERSION=1.3.2 0B <missing> /bin/sh -c ARCH= && dpkgArch="$(dpkg --printтАж 56.9MB <missing> /bin/sh -c #(nop) ENV NODE_VERSION=8.9.4 0B <missing> /bin/sh -c set -ex && for key in 94AE3тАж 129kB <missing> /bin/sh -c groupadd --gid 1000 node && useтАж 335kB <missing> /bin/sh -c set -ex; apt-get update; apt-geтАж 324MB <missing> /bin/sh -c apt-get update && apt-get installтАж 123MB <missing> /bin/sh -c set -ex; if ! command -v gpg > /тАж 0B <missing> /bin/sh -c apt-get update && apt-get installтАж 44.6MB <missing> /bin/sh -c #(nop) CMD ["bash"] 0B <missing> /bin/sh -c #(nop) ADD file:1dd78a123212328bdтАж 123MB
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдореЗрдВ рдкрд╛рдВрдЪ рдирдИ рдкрд░рддреЛрдВ рдХреА рд╡реГрджреНрдзрд┐ рд╣реБрдИ рд╣реИ: рд╣рдорд╛рд░реЗ Dockerfile
рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХред рдЖрдЗрдП рдЕрдм рдЪрд░рдгрдмрджреНрдз рдбреЙрдХрд░ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рдо рджреЛ рднрд╛рдЧреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдПрдХ рд╣реА Dockerfile
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
FROM node:8 as build WORKDIR /app COPY package.json index.js ./ RUN npm install FROM node:8 COPY --from=build /app / EXPOSE 3000 CMD ["index.js"]
Dockerfile
рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рддреАрди рдкрд░рддреЗрдВ рдмрдирд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдкрд░рддреЛрдВ рдХреЛ рд╕рдВрдпреБрдХреНрдд рдФрд░ рджреВрд╕рд░реЗ рдФрд░ рдЕрдВрддрд┐рдо рдЪрд░рдгреЛрдВ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдКрдкрд░ рдХреА рдЫрд╡рд┐ рдореЗрдВ рджреЛ рдФрд░ рдкрд░рддреЗрдВ рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИрдВред рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рдкрд░рддреЗрдВ рд╣реИрдВред

рдЪрд▓реЛ рдЗрд╕реЗ рдЖрдЬрдорд╛рдПрдБред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдПрдБ:
$ docker build -t node-multi-stage .
рдЗрддрд┐рд╣рд╛рд╕ рдХреА рдЬрд╛рдБрдЪ:
$ docker history node-multi-stage IMAGE CREATED BY SIZE 331b81a245b1 /bin/sh -c #(nop) CMD ["index.js"] 0B bdfc932314af /bin/sh -c #(nop) EXPOSE 3000 0B f8992f6c62a6 /bin/sh -c #(nop) COPY dir:e2b57dff89be62f77тАж 1.62MB b87c2ad8344d /bin/sh -c #(nop) CMD ["node"] 0B <missing> /bin/sh -c set -ex && for key in 6A010тАж 4.17MB <missing> /bin/sh -c #(nop) ENV YARN_VERSION=1.3.2 0B <missing> /bin/sh -c ARCH= && dpkgArch="$(dpkg --printтАж 56.9MB <missing> /bin/sh -c #(nop) ENV NODE_VERSION=8.9.4 0B <missing> /bin/sh -c set -ex && for key in 94AE3тАж 129kB <missing> /bin/sh -c groupadd --gid 1000 node && useтАж 335kB <missing> /bin/sh -c set -ex; apt-get update; apt-geтАж 324MB <missing> /bin/sh -c apt-get update && apt-get installтАж 123MB <missing> /bin/sh -c set -ex; if ! command -v gpg > /тАж 0B <missing> /bin/sh -c apt-get update && apt-get installтАж 44.6MB <missing> /bin/sh -c #(nop) CMD ["bash"] 0B <missing> /bin/sh -c #(nop) ADD file:1dd78a123212328bdтАж 123MB
рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ:
$ docker images | grep node- node-multi-stage 331b81a245b1 678MB node-vanilla 075d229d3f48 679MB
рд╣рд╛рдВ, рдпрд╣ рдЫреЛрдЯрд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
2. рд╣рдо рдбрд┐рд╕реНрдЯреНрд░реЛрд▓реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдВрдЯреЗрдирд░ рд╕реЗ рд╕рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ
рд╡рд░реНрддрдорд╛рди рдЫрд╡рд┐ рд╣рдореЗрдВ Node.js, yarn
, npm
, bash
рдФрд░ рдХрдИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рдмрд╛рдпрдиреЗрд░реА рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЙрдмрдВрдЯреВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕реЗ рддреИрдирд╛рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдХрдИ рдЙрдкрдпреЛрдЧреА рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдорд┐рд▓рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдВрдЯреЗрдирд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдХреЗрд╡рд▓ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИ Node.js.
рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрдкреВрд░реНрдг рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рддреЛ рд╣рдо Node.js. рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рд▓реЗрдХрд┐рди рдХреИрд╕реЗ?
Google рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдорд╛рди рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рд╣реИ - GoogleCloudPlatform / distroless ред
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рд╡рд┐рд╡рд░рдг рдкрдврд╝рддрд╛ рд╣реИ:
рдбрд┐рд╕реНрдЯреНрд░реЛрд▓реЗрд╕ рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдЙрд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдХреЛрдИ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░, рд╢реЗрд▓ рдпрд╛ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдорд╛рдирдХ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдг рдореЗрдВ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП!
рдирдИ рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Dockerfile
рдЪрд▓рд╛рдПрдВ:
FROM node:8 as build WORKDIR /app COPY package.json index.js ./ RUN npm install FROM gcr.io/distroless/nodejs COPY --from=build /app / EXPOSE 3000 CMD ["index.js"]
рд╣рдо рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдЫрд╡рд┐ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ:
$ docker build -t node-distroless .
рдЖрд╡реЗрджрди рдареАрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрдВрдЯреЗрдирд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП:
$ docker run -p 3000:3000 -ti --rm --init node-distroless
рдФрд░ http: // localhost: 3000 рдкрд░ рдЬрд╛рдПрдВ ред рдХреНрдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЗ рдмрд┐рдирд╛ рдЫрд╡рд┐ рдЖрд╕рд╛рди рд╣реЛ рдЧрдИ рд╣реИ?
$ docker images | grep node-distroless node-distroless 7b4db3b7f1e5 76.7MB
рдмрд╕ рдРрд╕реЗ рд╣реА! рдЕрдм рдЗрд╕рдХрд╛ рд╡рдЬрди рдХреЗрд╡рд▓ 76.7 рдПрдордмреА рд╣реИ, рдЬрд┐рддрдирд╛ рдХрд┐ 600 рдПрдордмреА рдХрдо!
рд╕рдм рдХреБрдЫ рд╢рд╛рдВрдд рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИред рдЬрдм рдХрдВрдЯреЗрдирд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$ docker exec -ti <insert_docker_id> bash
рдПрдХ рдЪрд▓ рд░рд╣реЗ рдХрдВрдЯреЗрдирд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдФрд░ bash
рд╢реБрд░реВ рдХрд░рдирд╛ SSH рд╕рддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред
рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдбрд┐рд╕реНрдЯреНрд░реЛрд▓реЗрд╕ рдореВрд▓ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдк-рдбрд╛рдЙрди рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдирд╣реАрдВ рд╣реИрдВ, рди рд╣реА, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рд╢реЗрд▓!
рд╢реЗрд▓ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдЪрд▓ рд░рд╣реЗ рдХрдВрдЯреЗрдирд░ рд╕реЗ рдХреИрд╕реЗ рдЬреБрдбрд╝реЗрдВ?
рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВред
рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдХреЗрд╡рд▓ рд╡рд╣реА рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ Node.js рд╣реИ:
$ docker exec -ti <insert_docker_id> node
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдореЗрдВ рдПрдХ рдкреНрд▓рд╕ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдХреБрдЫ рд╣рдорд▓рд╛рд╡рд░ рдХрдВрдЯреЗрдирд░ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╢реЗрд▓ рдХреА рдкрд╣реБрдВрдЪ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рдПрдЧрд╛ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдХрдо рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ - рдХрдо рд╡рдЬрди рдФрд░ рдЙрдЪреНрдЪ рд╕реБрд░рдХреНрд╖рд╛ред рд▓реЗрдХрд┐рди, рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреА рдХреАрдордд рдкрд░ред
рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рдмреЗрд╣рддрд░ рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рдирд┐рдЧрд░рд╛рдиреА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдореЗрдВ рдЕрднреА рднреА рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рднреА рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдбреЙрдХ рдХреА рдЫрд╡рд┐ рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд╣реЛ?
3. рдЕрд▓реНрдкрд╛рдЗрди рдХреЗ рд╕рд╛рде рдЖрдзрд╛рд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдХрдо рдХрд░реЗрдВ
рдЖрдк рдЕрд▓реНрдкрд╛рдЗрди рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдЕрдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛-рдЙрдиреНрдореБрдЦ, рд╣рд▓реНрдХреЗ рд╡рд┐рддрд░рдг рд╣реИ рдЬреЛ рдорд╕рд▓ рд▓рд┐рдмрд╛рд╕ рдФрд░ рдмрд┐рдЬреАрдмреЙрдХреНрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рд╢рдмреНрдж рдирд╣реАрдВ рд▓реЗрдВрдЧреЗ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗред
node:8-alpine
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Dockerfile
рдЪрд▓рд╛рдПрдВ node:8-alpine
:
FROM node:8 as build WORKDIR /app COPY package.json index.js ./ RUN npm install FROM node:8-alpine COPY --from=build /app / EXPOSE 3000 CMD ["npm", "start"]
рдПрдХ рдЪрд┐рддреНрд░ рдмрдирд╛рдПрдБ:
$ docker build -t node-alpine .
рдЖрдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
$ docker images | grep node-alpine node-alpine aa1f85f8e724 69.7MB
рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 69.7MB рд╣реИ - рдпрд╣ рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЫрд╡рд┐ рд╕реЗ рднреА рдХрдо рд╣реИред
рдЖрдЗрдП рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдВрдЯреЗрдирд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдбрд┐рд╕реНрдЯреНрд░реЛрд▓реНрд╕ рдХреА рдЫрд╡рд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ)ред
рдХрдВрдЯреЗрдирд░ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ:
$ docker run -p 3000:3000 -ti --rm --init node-alpine Example app listening on port 3000!
рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:
$ docker exec -ti 9d8e97e307d7 bash OCI runtime exec failed: exec failed: container_linux.go:296: starting container process caused "exec: \"bash\": executable file not found in $PATH": unknown
рдЕрд╕рдлрд▓ред рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрдВрдЯреЗрдирд░ рдореЗрдВ sh
...
$ docker exec -ti 9d8e97e307d7 sh / #
рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рд╣рдо рдХрдВрдЯреЗрдирд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ, рдФрд░ рд╕рд╛рде рд╣реА рдЗрд╕рдХреА рдЫрд╡рд┐ рднреА рдЫреЛрдЯреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ рдереАрдВред
рдЕрд▓реНрдкрд╛рдЗрди рдЫрд╡рд┐рдпрд╛рдВ muslc рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, C. рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рдЬрдмрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдг, рдЬреИрд╕реЗ рдЙрдмрдВрдЯреВ, рдбреЗрдмрд┐рдпрди рдФрд░ CentOS, glibc рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпреЗ рджреЛрдиреЛрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдХреНрд╖реНрдп рд╣реИрдВ: рдЧреНрд▓рд┐рдмрдХ рд╕рдмрд╕реЗ рдЖрдо рдФрд░ рддреЗрдЬрд╝ рд╣реИ, рдЬрдмрдХрд┐ рдорд╕рд▓рдХ рдХрдо рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдп рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдлрд┐рд░ рд╕реЗ рдХрдВрдкрд╛рдЗрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЕрд▓реНрдкрд╛рдЗрди рдЪрд┐рддреНрд░реЛрдВ рдкрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдорд╛рдирдХ рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрд▓рдЧ рд╣реИред рдЕрдВрддрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм precompiled рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ C ++ рдХреЗ рд▓рд┐рдП рдиреЛрдбреНрд╕ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рдкреНрдд рдкреНрд░реЗрдд рдкреИрдХреЗрдЬ рдЕрд▓реНрдкрд╛рдЗрди рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рддреЛ рдореВрд▓ рдЫрд╡рд┐ рдХреНрдпрд╛ рдЪреБрдирдирд╛ рд╣реИ?
рдЕрд▓реНрдкрд╛рдЗрди, рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдпрд╛ рд╡реЗрдирд┐рд▓рд╛ рджреЗрдЦреЛ - рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
рдпрджрд┐ рдЖрдк рдареЗрд╕ рд╕реЗ рдирд┐рдкрдЯ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдЕрдирд┐рдпрдВрддреНрд░рдг рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛ред
рдбреЙрдХрд░ рдЫрд╡рд┐ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдирд░реА рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЬреЛрдЦрд┐рдо рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рдЗрдирд░реА рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдЗрд╕ рдЬреЛрдЦрд┐рдо рдХреЛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ рд╣рдорд▓рд╛рд╡рд░ рдХрд┐рд╕реА рд╡рд┐рдЪрд▓рд┐рдд рдЫрд╡рд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рднреЗрджреНрдпрддрд╛ рдкрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╢реЗрд▓ рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рдерд╛!
рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдгрд╡рд╢ docker рдХреА рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдВрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрд▓реНрдкрд╛рдЗрди-рдЖрдзрд╛рд░рд┐рдд рдЫрд╡рд┐рдпреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред
рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЫреЛрдЯреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рд╕рдВрдЧрддрддрд╛ рдХреА рдХреАрдордд рдкрд░ред рдЕрд▓реНрдкрд╛рдЗрди рдПрдХ рдЕрд▓рдЧ рдорд╛рдирдХ рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдорд╕реНрдХреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрднреА-рдХрднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреЙрдк рдЕрдк рд╣реЛ рдЬрд╛рдПрдВрдЧреАред рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдВрдХ рдкрд░ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/grpc/grpc/issues/8528 рдФрд░ https://github.com/grpc/grpc/issues/6126 ред
рд╡реЗрдирд┐рд▓рд╛ рдЫрд╡рд┐рдпрд╛рдВ рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИрдВред
рд╣рд╛рдВ, рд╡реЗ рдмрдбрд╝реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдмрдВрдЯреВ рд╕реНрдерд╛рдкрд┐рдд рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг рдорд╢реАрди рдкрд░ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдУрдПрд╕ рдореЗрдВ рд╕рднреА рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рдкреНрд░рд╛рдкреНрдд рдбреЛрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд▓рд┐рдЦреЗрдВ:
node:8
681 рдПрдордмреА
node:8
678MB рд╡реГрджреНрдзрд┐рд╢реАрд▓ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде node:8
gcr.io/distroless/nodejs
76.7MB
node:8-alpine
69.7 рдПрдордмреА
рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ рд╢рдмреНрдж рдЬреБрджрд╛ рдХрд░рдирд╛
рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдкрд░ рдЕрдиреНрдп рд▓реЗрдЦ рдкрдврд╝реЗрдВ:
рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рд╕реНрдЯреЗрдЯрдлрд╝реБрд▓ рдмреИрдХрдЕрдк
рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рд╖рдо рд╡реЗрдм рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛
рд░реЗрдбрдорд╛рдЗрди рдХреЗ рд▓рд┐рдП рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдмреЙрдЯред рдЕрдкрдиреЗ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ