
給寫 Dockerfile 時在
ADD和COPY之間猶豫的你。
先講結論
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 -O 或 RUN wget 更好,因為你可以在同一個 RUN 裡下載完馬上清理,減少 image layer 大小。
什麼時候用哪個?
| 情境 | 用什麼 |
|---|---|
| 一般檔案複製 | COPY(永遠優先) |
| 需要自動解壓 tar 到容器裡 | ADD |
| 從 URL 下載 | RUN curl / RUN wget |
就這三條規則,夠簡單到可以貼在螢幕旁邊。
如果你要用 ADD,請在 Dockerfile 旁邊加個註解說明為什麼。未來的你會感謝現在的你。