cover

給寫 Dockerfile 時在 ADDCOPY 之間猶豫的你。

先講結論

90% 的情況用 COPY 就對了。 ADD 有兩個額外功能:自動解壓縮和支援 URL 下載,但這兩個功能反而容易讓人搞混 Dockerfile 的意圖。Docker 官方自己都說「優先用 COPY」。

COPY:做一件事,做好

COPY <source> <destination>

就是把本地檔案複製到容器裡,就這樣。不會幫你解壓、不會幫你下載、不會偷偷做任何你沒預期的事。語意明確,reviewer 一看就懂。

ADD:功能多不見得是好事

ADD <source> <destination>

比 COPY 多兩招:

  • 如果 source 是 tar/gzip/bzip2/xz 壓縮檔,自動解壓縮到目標路徑
  • 可以從 URL 下載檔案(但 Docker 官方不推薦這樣用)

聽起來很方便對吧?問題是,當別人讀你的 Dockerfile 看到 ADD app.tar.gz /app/,他得停下來想:「這是要複製壓縮檔,還是要解壓縮?」——用 COPY 就不會有這個疑問。

至於 URL 下載,用 RUN curl -ORUN wget 更好,因為你可以在同一個 RUN 裡下載完馬上清理,減少 image layer 大小。

什麼時候用哪個?

情境用什麼
一般檔案複製COPY(永遠優先)
需要自動解壓 tar 到容器裡ADD
從 URL 下載RUN curl / RUN wget

就這三條規則,夠簡單到可以貼在螢幕旁邊


如果你要用 ADD,請在 Dockerfile 旁邊加個註解說明為什麼。未來的你會感謝現在的你。

延伸閱讀