Docker COPY 復(fù)制文件夾的詭異行為

問(wèn)題現(xiàn)象

在制作 docker 鏡像時(shí),有復(fù)制某一個(gè)路徑下所有文件和文件夾到鏡像的需求,寫(xiě)下了如下 dockerfile:

FROM alpine
WORKDIR /root/test_docker_proj
COPY * ./

原始目錄結(jié)構(gòu)是這樣的:

/projects/test_docker_proj
├── Dockerfile
├── dir1
│   ├── dir11
│   │   └── file11
│   └── file1
└── file2

然而復(fù)制到 docker 鏡像里的目錄結(jié)構(gòu)變成了這樣:

/root/test_docker_proj
├── Dockerfile
├── dir11
│   └── file11
├── file1
└── file2

可以看到 dir1 這個(gè)文件夾并沒(méi)有被復(fù)制到鏡像里,但是 dir1 中的子文件夾和文件都被復(fù)制進(jìn)來(lái)了,和 dir1 同級(jí)的文件也被復(fù)制了。也就是說(shuō),在 COPY 執(zhí)行的過(guò)程中,第一層文件夾被「解包」了。

COPY/ADD 行為邏輯

為了確定 COPY 和相似的 ADD 命令的行為,做了以下測(cè)試:

FROM alpine

WORKDIR /root/test_docker_proj_1
COPY * ./

WORKDIR /root/test_docker_proj_2
ADD * ./

WORKDIR /root/test_docker_proj_3
COPY ./ ./

WORKDIR /root/test_docker_proj_4
ADD ./ ./

WORKDIR /root/test_docker_proj_5
COPY ./dir* ./

WORKDIR /root/test_docker_proj_6
ADD ./dir* ./

通過(guò)測(cè)試可以發(fā)現(xiàn) COPY/ADD 命令有這么幾個(gè)規(guī)則:

  1. ADD 命令和 COPY 命令在復(fù)制文件時(shí)行為一致
  2. 使用 * 作為 COPY/ADD 命令的源時(shí)候表示的是 ./*
  3. COPY/ADD 命令的源如果是文件夾,復(fù)制的是文件夾的內(nèi)容而不是其本身
  4. COPY ./* target 中的 * 會(huì)被翻譯成如下的邏輯:
COPY ./sub_dir1 target
COPY ./sub_dir2 target
COPY ./file1 target
COPY ./file2 target

文件系統(tǒng)里的文件夾和文件,本質(zhì)上都是文件,我們熟悉的操作系統(tǒng)的 cp 命令在執(zhí)行 cp * target 時(shí)會(huì)把文件夾當(dāng)成文件一股腦的復(fù)制到目標(biāo)路徑下,可以認(rèn)為復(fù)制了文件本身,而 docker 的 COPY/ADD 在復(fù)制文件夾時(shí)復(fù)制的是其內(nèi)容

docker 的這種「奇怪」的邏輯已經(jīng)被詬病許久了,但是似乎還沒(méi)有要改變的意思,最新的進(jìn)展可以參考下面兩個(gè) issue,在 docker 做出修改之前,只能在寫(xiě) dockerfile 時(shí)候注意一下了。

參考文檔

https://stackoverflow.com/questions/30256386/how-to-copy-multiple-files-in-one-layer-using-a-dockerfile

https://github.com/moby/moby/issues/15858

https://github.com/moby/moby/issues/29211

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,996評(píng)論 1 21
  • 在前面兩節(jié)我們學(xué)習(xí)了如何安裝以及簡(jiǎn)單的運(yùn)行管理docker容器,在本節(jié)我們將會(huì)更多的探討關(guān)于docker鏡像的知識(shí)...
    井底蛙蛙呱呱呱閱讀 4,263評(píng)論 0 5
  • 原文地址:https://github.com/KeKe-Li/docker-directive docker 存...
    萌面菠蘿閱讀 560評(píng)論 0 0
  • 實(shí)例來(lái)源:tofar 摘錄來(lái)源:Docker — 從入門(mén)到實(shí)踐 歡迎大家添加自己的實(shí)例 (email: yun_...
    molscar閱讀 484評(píng)論 1 1
  • Docker簡(jiǎn)介Docker是一個(gè)由GO語(yǔ)言寫(xiě)的程序運(yùn)行的“容器”; 目前云服務(wù)的基石是操作系統(tǒng)級(jí)別的隔離,在同一...
    gakiww閱讀 647評(píng)論 0 0

友情鏈接更多精彩內(nèi)容