ʻO kekahi mau ʻōlelo aʻoaʻo pehea e wikiwiki ai ke kūkulu ʻana i nā kiʻi Docker. No ka laʻana, a hiki i 30 kekona

Ma mua o ka hoʻomaka ʻana o kahi hiʻohiʻona, i kēia mau lā o nā mea hoʻokani paʻakikī a me CI/CD, aia kahi ala lōʻihi e hele ai mai ka hana ʻana i nā hoʻokolohua a me ka lawe ʻana. Ma mua, hiki iā ʻoe ke hoʻouka i nā faila hou ma o FTP (ʻaʻohe mea e hana hou, ʻaʻole?), A ke kaʻina hana "deployment" i mau kekona. I kēia manawa pono ʻoe e hana i kahi noi hoʻohui a kali lōʻihi no ka hiʻohiʻona e hiki i nā mea hoʻohana.

ʻO kahi o kēia ala ke kūkulu nei i kahi kiʻi Docker. I kekahi manawa he mau minuke ka ʻaha, i kekahi manawa he ʻumi mau minuke, ʻaʻole hiki ke kapa ʻia he maʻamau. Ma kēia ʻatikala, e lawe mākou i kahi noi maʻalahi a mākou e hoʻopili ai i kahi kiʻi, e hoʻopili i nā ʻano hana e wikiwiki ai ke kūkulu ʻana, a nānā i nā nuances o ka hana ʻana o kēia mau ʻano.

ʻO kekahi mau ʻōlelo aʻoaʻo pehea e wikiwiki ai ke kūkulu ʻana i nā kiʻi Docker. No ka laʻana, a hiki i 30 kekona

Loaʻa iā mākou ka ʻike maikaʻi i ka hana ʻana a me ke kākoʻo ʻana i nā pūnaewele media: LAW, ʻO ka Bell, "Nupepa Hou", Aupuni Repubalika… ʻAʻole i liʻuliʻu ua hoʻonui mākou i kā mākou kōpili ma ka hoʻokuʻu ʻana i kahi pūnaewele huahana Hoʻomanaʻo. A ʻoiai ua hoʻohui koke ʻia nā hiʻohiʻona hou a ua hoʻopaʻa ʻia nā ʻōpala kahiko, ua lilo ka lohi lohi i pilikia nui.

Hoʻopili mākou iā GitLab. ʻOhi mākou i nā kiʻi, kipaku iā lākou i ka GitLab Registry a ʻōwili iā lākou i waho i ka hana. ʻO ka mea lōʻihi loa ma kēia papa inoa ʻo ka hui ʻana i nā kiʻi. No ka laʻana: me ka ʻole o ka hoʻonui ʻana, lawe ʻia kēlā me kēia kūkulu hope i 14 mau minuke.

ʻO kekahi mau ʻōlelo aʻoaʻo pehea e wikiwiki ai ke kūkulu ʻana i nā kiʻi Docker. No ka laʻana, a hiki i 30 kekona

I ka hopena, ua maopopo ka hiki ʻole iā mākou ke noho hou e like me kēia, a noho mākou e noʻonoʻo i ke kumu o ka lōʻihi o ka ʻohi ʻana o nā kiʻi. ʻO ka hopena, ua hoʻemi mākou i ka manawa hui i 30 kekona!

ʻO kekahi mau ʻōlelo aʻoaʻo pehea e wikiwiki ai ke kūkulu ʻana i nā kiʻi Docker. No ka laʻana, a hiki i 30 kekona

No kēia ʻatikala, i ʻole e pili ʻia i ke kaiapuni o Reminder, e nānā i kahi laʻana o ka hoʻohui ʻana i kahi noi Angular ʻole. No laila, e hana mākou i kā mākou noi:

ng n app

Hoʻohui i ka PWA iā ia (ua holomua mākou):

ng add @angular/pwa --project app

ʻOiai ke hoʻoiho ʻia nei nā pūʻolo npm miliona, e noʻonoʻo kākou pehea e hana ai ke kiʻi docker. Hāʻawi ʻo Docker i ka hiki ke hoʻopili i nā noi a holo iā lākou i kahi kaʻawale i kapa ʻia he pahu. Mahalo i ka hoʻokaʻawale ʻana, hiki iā ʻoe ke holo i nā pahu he nui i ka manawa like ma kahi kikowaena hoʻokahi. ʻOi aku ka māmā o nā pahu ma mua o nā mīkini virtual no ka mea holo pololei lākou ma ka ʻōnaehana kernel. No ka holo ʻana i kahi pahu me kā mākou noi, pono mākou e hana i kahi kiʻi kahi e hoʻopili ai mākou i nā mea āpau e pono ai kā mākou noi e holo. ʻO ka mea nui, ʻo ke kiʻi ke kope o ka ʻōnaehana faila. No ka laʻana, e lawe i ka Dockerfile:

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

ʻO kahi Dockerfile kahi papa kuhikuhi; Ma ka hana ʻana i kēlā me kēia o lākou, e mālama ʻo Docker i nā loli i ka ʻōnaehana faila a uhi iā lākou i nā mea ma mua. Hoʻokumu kēlā me kēia hui i kona papa ponoʻī. Aʻo ke kiʻi i hoʻopauʻia he mau papa i hui pūʻia.

ʻO ka mea nui e ʻike: hiki i kēlā me kēia papa Docker ke hūnā. Inā ʻaʻohe mea i loli mai ka hana hope loa, a laila ma kahi o ka hoʻokō ʻana i ke kauoha, e lawe ka docker i kahi papa i mākaukau. No ka mea, ʻo ka hoʻonui nui ʻana i ka wikiwiki o ke kūkulu ʻana ma muli o ka hoʻohana ʻana i ka cache, i ke ana ʻana i ka wikiwiki o ke kūkulu ʻana, e hoʻolohe pono mākou i ke kūkulu ʻana i kiʻi me kahi huna i hoʻomākaukau ʻia. No laila, ʻanuʻu i kēlā me kēia ʻanuʻu:

  1. Holoi mākou i nā kiʻi ma ka ʻāina i ʻole e pili nā holo mua i ka hoʻāʻo.
    docker rmi $(docker images -q)
  2. Hoʻomaka mākou i ke kūkulu ʻana no ka manawa mua.
    time docker build -t app .
  3. Hoʻololi mākou i ka faila src/index.html - hoʻohālike mākou i ka hana a kahi mea papahana.
  4. Holo mākou i ke kūkulu i ka lua o ka manawa.
    time docker build -t app .

Inā hoʻonohonoho pololei ʻia ke kaiapuni no ke kūkulu ʻana i nā kiʻi (ʻoi aʻe ma lalo o lalo), a laila i ka wā e hoʻomaka ai ke kūkulu ʻana, loaʻa iā Docker he pūʻulu huna ma luna o ka moku. ʻO kā mākou hana ʻo ke aʻo ʻana pehea e hoʻohana ai i ka cache i hiki i ke kūkulu ke holo wikiwiki. No ka mea ke manaʻo nei mākou ʻo ka holo ʻana i kahi hale me ka ʻole o kahi cache e hana wale ana - ʻo ka manawa mua loa - no laila hiki iā mākou ke haʻalele i ka lohi o kēlā manawa mua. Ma nā ho'āʻo, he mea nui iā mākou ka holo lua o ke kūkulu ʻana, ke hoʻomaʻamaʻa ʻia nā caches a mākaukau mākou e kālua i kā mākou keke. Eia nō naʻe, pili kekahi mau ʻōlelo aʻoaʻo i ka hana mua.

E hoʻokomo i ka Dockerfile i wehewehe ʻia ma luna o ka waihona papahana a hoʻomaka i ke kūkulu. Ua hoʻopili ʻia nā papa inoa a pau no ka maʻalahi o ka heluhelu ʻana.

$ 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

Hoʻololi mākou i nā mea o src/index.html a holo i ka lua o ka manawa.

$ 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

No ka ʻike inā loaʻa iā mākou ke kiʻi, e holo i ke kauoha docker images:

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

Ma mua o ke kūkulu ʻana, lawe ʻo docker i nā faila āpau i ka pōʻaiapili o kēia manawa a hoʻouna iā lākou i kāna daemon Sending build context to Docker daemon 409MB. Ua kuhikuhi ʻia ka pōʻaiapili kūkulu ma ke ʻano he hoʻopaʻapaʻa hope loa i ke kauoha kūkulu. I kā mākou hihia, ʻo kēia ka papa kuhikuhi o kēia manawa - ".", - a huki ʻo Docker i nā mea āpau a mākou i kēia waihona. He nui ka 409 MB: e noʻonoʻo kākou pehea e hoʻoponopono ai.

Hoʻemi i ka pōʻaiapili

No ka ho'ēmiʻana i ka pōʻaiapili, aiaʻelua mau koho. A i ʻole e kau i nā faila a pau e pono ai no ka hui ʻana i kahi waihona ʻokoʻa a kuhikuhi i ka pōʻaiapili docker i kēia waihona. ʻAʻole hiki ke maʻalahi kēia i nā manawa a pau, no laila hiki ke kuhikuhi i nā ʻokoʻa: ʻaʻole pono e kauo ʻia i loko o ka pōʻaiapili. No ka hana ʻana i kēia, e hoʻokomo i ka faila .dockerignore i ka papahana a hōʻike i ka mea pono ʻole no ke kūkulu ʻana:

.git
/node_modules

a holo hou i ka hana:

$ 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

ʻOi aku ka maikaʻi o 607.2 KB ma mua o 409 MB. Ua hōʻemi pū mākou i ka nui o ke kiʻi mai 1.74 a i 1.38 GB:

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

E ho'āʻo kākou e hoʻemi i ka nui o ke kiʻi.

Hoʻohana mākou iā Alpine

ʻO kekahi ala e mālama ai i ka nui o ke kiʻi, ʻo ia ke hoʻohana ʻana i kahi kiʻi makua liʻiliʻi. ʻO ke kiʻi makua ke kiʻi ma ke kumu i hoʻomākaukau ʻia ai kā mākou kiʻi. Hōʻike ʻia ka papa lalo e ke kauoha FROM ma Dockerfile. I kā mākou hihia, ke hoʻohana nei mākou i kahi kiʻi i hoʻokumu ʻia ʻo Ubuntu i hoʻokomo ʻia nā nodejs. A ua kaumaha ...

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

... aneane he gigabyte. Hiki iā ʻoe ke hoʻemi nui i ka leo ma ka hoʻohana ʻana i kahi kiʻi e pili ana iā Alpine Linux. ʻO Alpine kahi Linux liʻiliʻi loa. ʻO ke kiʻi docker no nā nodejs e pili ana i ka alpine he 88.5 MB wale nō ke kaumaha. No laila e hoʻololi i kā mākou kiʻi ola i loko o nā hale:

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

Pono mākou e hoʻokomo i kekahi mau mea e pono ai ke kūkulu i ka noi. ʻAe, ʻaʻole kūkulu ʻo Angular me ka ʻole o Python ¯(°_o)/¯

Akā ua hāʻule ka nui kiʻi i 150 MB:

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

E hele hou kāua.

Hui nui

ʻAʻole nā ​​mea a pau i loko o ke kiʻi ka mea e pono ai mākou i ka hana.

$ 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

Me ke kōkuaʻana o docker run app ls -lah ua hoʻokuʻu mākou i kahi pahu e pili ana i kā mākou kiʻi app a hoʻokō i ke kauoha i loko ls -lah, a pau ka pahu i ka hana.

I ka hana ʻana, pono mākou i kahi waihona dist. I kēia hihia, pono e hāʻawi ʻia nā faila ma waho. Hiki iā ʻoe ke holo i kekahi kikowaena HTTP ma nā nodejs. Akā e maʻalahi mākou. E noʻonoʻo i kahi huaʻōlelo Lūkini nona nā hua ʻehā "y". Akau! Ynzhynyksy. E lawe kāua i kahi kiʻi me ka nginx, e kau i kahi waihona i loko dist a me kahi hoʻonohonoho liʻiliʻi:

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

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

E kōkua mai ke kūkulu ʻana i nā pae he nui iā mākou e hana i kēia mau mea a pau. E hoʻololi i kā mākou 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 .

I kēia manawa ua loaʻa iā mākou ʻelua kuhikuhi FROM i ka Dockerfile, holo kēlā me kēia o lākou i kahi hana kūkulu ʻokoʻa. Ua kāhea mākou i ka mea mua builder, akā e hoʻomaka ana mai ka FROM hope, e hoʻomākaukau ʻia kā mākou kiʻi hope. ʻO ka hana hope loa e kope i ka artifact o kā mākou hui ma ka pae mua i ke kiʻi hope me ka nginx. Ua emi nui ka nui o ke kiʻi:

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

E holo kāua i ka ipu me kā mākou kiʻi a hōʻoia i ka holo ʻana o nā mea a pau:

docker run -p8080:80 app

Ke hoʻohana nei i ka -p8080:80 koho, ua hoʻouna mākou i ke awa 8080 ma kā mākou mīkini hoʻokipa i ka port 80 i loko o ka pahu kahi e holo ai ka nginx. Wehe ma ka polokalamu kele pūnaewele http://localhost:8080/ a ʻike mākou i kā mākou noi. Ke hana nei nā mea a pau!

ʻO kekahi mau ʻōlelo aʻoaʻo pehea e wikiwiki ai ke kūkulu ʻana i nā kiʻi Docker. No ka laʻana, a hiki i 30 kekona

ʻO ka hōʻemi ʻana i ka nui kiʻi mai 1.74 GB a i 36 MB e hoʻemi nui i ka manawa e lawe ai i kāu noi i ka hana. Akā, e hoʻi kākou i ka manawa hui.

$ 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

Ke hoʻololi nei i ke ʻano o nā papa

Ua hūnā ʻia kā mākou mau ʻanuʻu mua ʻekolu (hint Using cache). Ma ka ʻanuʻu ʻehā, kope ʻia nā faila papahana a ma ka pae ʻelima e hoʻokomo ʻia nā mea hilinaʻi RUN npm ci - e like me 47.338s. No ke aha e hoʻouka hou ai i nā hilinaʻi i kēlā me kēia manawa inā loli pinepine lākou? E noʻonoʻo kākou i ke kumu i hūnā ʻole ʻia ai lākou. ʻO ke kumu e nānā ʻo Docker i ka papa ma ka papa e ʻike inā ua loli ke kauoha a me nā faila e pili ana. I ka hā o ka ʻanuʻu, kope mākou i nā faila a pau o kā mākou papahana, a i waena o lākou, ʻoiaʻiʻo, aia nā loli, no laila ʻaʻole lawe wale ʻo Docker i kēia papa mai ka cache, akā ʻo nā mea a pau ma hope! E hana i kekahi mau hoʻololi liʻiliʻi i ka 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 .

ʻO ka mua, ua kope ʻia ka package.json a me ka package-lock.json, a laila hoʻokomo ʻia nā mea hilinaʻi, a ma hope wale nō ke kope ʻia ka papahana holoʻokoʻa. Ma ka hopena:

$ 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 kekona ma kahi o 3 mau minuke - ʻoi aku ka maikaʻi! He mea nui ka hoʻonohonoho pono ʻana o nā papa: kope mua mākou i ka mea i loli ʻole, a laila he aha ka loli pinepine, a ʻo ka mea hope ka mea e loli pinepine ai.

A laila, he mau huaʻōlelo e pili ana i ka hui ʻana i nā kiʻi ma nā ʻōnaehana CI/CD.

Ke hoʻohana nei i nā kiʻi ma mua no ka hūnā

Inā mākou e hoʻohana i kekahi ʻano o ka hopena SaaS no ke kūkulu ʻana, a laila maʻemaʻe a hou ka cache Docker kūloko. No ka hāʻawi ʻana i ka docker i kahi e kiʻi ai i nā papa i kālua ʻia, hāʻawi iā ia i ke kiʻi i kūkulu ʻia ma mua.

E lawe i kahi laʻana o ke kūkulu ʻana i kā mākou noi ma GitHub Actions. Hoʻohana mākou i kēia config

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

Hōʻuluʻulu ʻia ke kiʻi a paʻi ʻia i GitHub Packages i ʻelua mau minuke a me 20 kekona:

ʻO kekahi mau ʻōlelo aʻoaʻo pehea e wikiwiki ai ke kūkulu ʻana i nā kiʻi Docker. No ka laʻana, a hiki i 30 kekona

I kēia manawa, e hoʻololi kākou i ke kūkulu ʻana i hoʻohana ʻia kahi cache e pili ana i nā kiʻi i kūkulu ʻia ma mua:

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

ʻO ka mea mua pono mākou e haʻi iā ʻoe i ke kumu i hoʻomaka ʻia ai nā kauoha ʻelua build. ʻO ka mea ʻoiaʻiʻo, i loko o kahi hui multistage ke kiʻi i loaʻa i kahi hoʻonohonoho o nā papa mai ka pae hope. I kēia hihia, ʻaʻole e hoʻokomo ʻia nā papa mai nā papa mua i ke kiʻi. No laila, i ka hoʻohana ʻana i ke kiʻi hope loa mai kahi kūkulu mua, ʻaʻole hiki iā Docker ke ʻimi i nā papa mākaukau e kūkulu i ke kiʻi me nā nodejs (kūkulu kahua). No ka hoʻoponopono ʻana i kēia pilikia, hana ʻia kahi kiʻi waena $IMAGE_NAME-builder-stage a hoʻokuʻu ʻia i nā Pūʻulu GitHub i hiki ke hoʻohana ʻia i kahi kūkulu ma hope ma ke ʻano he kumu huna.

ʻO kekahi mau ʻōlelo aʻoaʻo pehea e wikiwiki ai ke kūkulu ʻana i nā kiʻi Docker. No ka laʻana, a hiki i 30 kekona

Ua hoʻemi ʻia ka manawa hui a pau i hoʻokahi minuke a me ka hapa. Hoʻopau ʻia ka hapalua minuke i ka huki ʻana i nā kiʻi mua.

Kiʻi mua

ʻO kahi ala ʻē aʻe e hoʻoponopono ai i ka pilikia o kahi cache Docker maʻemaʻe ʻo ia ka neʻe ʻana i kekahi o nā papa i kahi Dockerfile ʻē aʻe, kūkulu ʻokoʻa iā ia, kaomi i loko o ka Container Registry a hoʻohana iā ia ma ke ʻano he makua.

Hana mākou i kā mākou kiʻi nodejs e kūkulu i kahi noi Angular. E hana i Dockerfile.node i ka papahana

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

ʻOhi mākou a pana i kahi kiʻi ākea ma Docker Hub:

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

I kēia manawa i kā mākou Dockerfile nui mākou e hoʻohana ai i ke kiʻi i hoʻopau ʻia:

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

I kā mākou laʻana, ʻaʻole i emi ka manawa kūkulu, akā hiki ke hoʻohana i nā kiʻi i kūkulu mua ʻia inā he nui kāu mau papahana a pono e hoʻokomo i nā mea hilinaʻi like i kēlā me kēia.

ʻO kekahi mau ʻōlelo aʻoaʻo pehea e wikiwiki ai ke kūkulu ʻana i nā kiʻi Docker. No ka laʻana, a hiki i 30 kekona

Ua nānā mākou i kekahi mau ala no ka wikiwiki ʻana i ke kūkulu ʻana i nā kiʻi docker. Inā makemake ʻoe e holo wikiwiki, e hoʻohana i kēia i kāu papahana:

  • e hoemi ana i ka pōʻaiapili;
  • hoʻohana i nā kiʻi makua liʻiliʻi;
  • hui lehulehu;
  • hoʻololi i ke ʻano o nā kuhikuhi i ka Dockerfile e hoʻohana pono i ka cache;
  • hoʻonohonoho i kahi hūnā ma nā ʻōnaehana CI/CD;
  • hana mua i nā kiʻi.

Manaʻo wau e hoʻomaʻamaʻa ʻia ka hiʻohiʻona pehea e hana ai ʻo Docker, a hiki iā ʻoe ke hoʻonohonoho pono i kāu kau ʻana. I mea e pāʻani ai me nā laʻana mai ka ʻatikala, ua hana ʻia kahi waihona https://github.com/devopsprodigy/test-docker-build.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka