雲端與容器基礎

FROM node:lts
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
CMD ["node", "dist/server.js"]

上面的 Dockerfile(B),是把在 COPY . . 之後放 RUN npm ci 的 Dockerfile(A),改成只先複製相依套件檔案的順序。npm ci 需要120秒、npm run build 需要30秒、COPY . . 需要2秒,其他指令的時間可忽略。每天20次只修改 src 底下的原始碼(不修改 package.json 與 package-lock.json)後重新建置映像檔。在可使用上次建置的快取時,以每天建置時間的合計來看,B 比 A 少的時間為下列何者?

  1. A2分鐘
  2. B約11分鐘
  3. C40分鐘
查看答案與解析

正確答案:C. 40分鐘

建置快取以指令為單位使用,對 COPY 而言,是以要複製的檔案內容是否與上次相同來判斷。某個指令的快取一旦無法使用,之後的指令全部都要重新執行。A 在第一個 COPY . . 就發現變化,因此每次需要 2 + 120 + 30 = 152秒。B 的 package.json 與 package-lock.json 沒有變,快取可一直使用到 npm ci,只需 COPY . . 與 npm run build 的 2 + 30 = 32秒。每次相差120秒,20次為2,400秒 = 40分鐘。

  • A. 這是1次建置的差(120秒 = 2分鐘)。每天重新建置20次,所以要乘以20。
  • B. 這是 B 每天的合計(32秒 × 20 = 640秒,約11分鐘),不是與 A 的差。
  • C. 正確。(152 − 32) × 20 = 2,400秒 = 40分鐘。
練習這個領域 前往領域頁面

雲端與容器基礎的其他題目

  1. 在 Docker 中,關於為了保留容器寫入的資料而使用的具名磁碟區(named volume)與繫結掛載(bind mount),下列何者正確?
  2. 指定 registry.example.com/team/web:1.4 來拉取(pull)映像檔。這個指定中各部分意義的組合,下列何者正確?
  3. scratch 是不含任何檔案的空映像檔。以上面的多階段建置 Dockerfile 建置的最終映像檔所包含的內容,下列何者正確?
  4. 在 Kubernetes 中,作為部署與管理的最小單位,把1個以上的容器組合在一起並讓它們共用同一IP位址與磁碟區的是下列何者?
  5. 在 Kubernetes 中,指定 replicas: 3 的 Deployment 有3個 Pod 在執行。以 kubectl delete pod 刪除其中1個 Pod 時發生的事,下列何者正確?