雲端與容器基礎

FROM alpine
COPY data.tar.gz /tmp/
RUN tar -xzf /tmp/data.tar.gz -C /opt && rm /tmp/data.tar.gz

為了解開500 MB的封存檔 data.tar.gz,以上面的 Dockerfile 建置映像檔。雖然解開後在同一個 RUN 中刪除了封存檔,映像檔仍然大了一個封存檔的大小。原因與對策的組合,下列何者最適當?

  1. A&& 之後的 rm 在建置時不會執行。把 rm 寫成另一個 RUN 指令
  2. B刪除的檔案會作為建置快取留在映像檔中。在 docker build 加上 --no-cache 重新建置
  3. C封存檔留在 COPY 指令建立的層中。以多階段建置,只把解開後的檔案複製到最終映像檔
查看答案與解析

正確答案:C. 封存檔留在 COPY 指令建立的層中。以多階段建置,只把解開後的檔案複製到最終映像檔

Dockerfile 的指令中,會改變檔案系統的指令(COPY、RUN 等)各自成為1層,映像檔就是這些層的疊加。即使在後面的層刪除檔案,也只是在上層記錄一個已刪除的標記,進入 COPY 層的500 MB封存檔仍留在映像檔中。若以多階段建置在另一個階段解開,再用 COPY --from 只把解開後的檔案帶到最後階段,最終映像檔就不含封存檔。在1個 RUN 中完成下載、解開與刪除也是一種方法,但無法用於以 COPY 帶入的檔案。

  • A. && 之後的 rm 也會在同一個 RUN 中執行。分成另一個 RUN 只會多一層刪除標記,大小不會減少。
  • B. --no-cache 只是不重複使用先前建置的結果,層的內容相同,因此大小不變。
  • C. 正確。即使刪除,下層的內容仍會保留,所以要讓它不進入最終映像檔。
練習這個領域 前往領域頁面

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

  1. 有5個映像檔,都在同一個基礎映像檔(120 MB)之上各疊加30 MB的專屬層。不考慮層的壓縮與中繼資料的容量。把這5個映像檔全部拉取(pull)到1台伺服器時,映像檔使用的磁碟容量為下列何者?
  2. 在上面的 Dockerfile 中,以 docker build 建置映像檔時執行的指令,與以 docker run 啟動容器時執行的指令,其組合下列何者正確?
  3. 以 docker run pinger example.com 啟動由上面的 Dockerfile 建置的映像檔 pinger。在容器內執行的指令為下列何者?
  4. 以上面的指令,從在連接埠80等待連線的 Web 伺服器映像檔 nginx 啟動容器。主機的IP位址為 192.0.2.10,且沒有防火牆等限制。從同一網路中另一台PC的瀏覽器連線到這個 Web 伺服器的URL,下列何者正確?
  5. 上面的 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 少的時間為下列何者?