欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Dockerfile 中的 COPY 與 ADD 命令

 更新時間:2018年09月03日 09:22:59   作者:sparkdev  
Dockerfile 中提供了兩個非常相似的命令 COPY 和 ADD,本文嘗試解釋這兩個命令的基本功能,以及其異同點,然后總結(jié)其各自適合的應(yīng)用場景。感興趣的朋友跟隨小編一起看看吧

Dockerfile 中提供了兩個非常相似的命令 COPY 和 ADD,本文嘗試解釋這兩個命令的基本功能,以及其異同點,然后總結(jié)其各自適合的應(yīng)用場景。

Build 上下文的概念

在使用 docker build 命令通過 Dockerfile 創(chuàng)建鏡像時,會產(chǎn)生一個 build 上下文(context)。所謂的 build 上下文就是 docker build 命令的 PATH 或 URL 指定的路徑中的文件的集合。在鏡像 build 過程中可以引用上下文中的任何文件,比如我們要介紹的 COPY 和 ADD 命令,就可以引用上下文中的文件。

默認情況下 docker build -t testx . 命令中的 . 表示 build 上下文為當(dāng)前目錄。當(dāng)然我們可以指定一個目錄作為上下文,比如下面的命令:

$ docker build -t testx /home/nick/hc

我們指定 /home/nick/hc 目錄為 build 上下文,默認情況下 docker 會使用在上下文的根目錄下找到的 Dockerfile 文件。

COPY 和 ADD 命令不能拷貝上下文之外的本地文件

對于 COPY 和 ADD 命令來說,如果要把本地的文件拷貝到鏡像中,那么本地的文件必須是在上下文目錄中的文件。其實這一點很好解釋,因為在執(zhí)行 build 命令時,docker 客戶端會把上下文中的所有文件發(fā)送給 docker daemon??紤] docker 客戶端和 docker daemon 不在同一臺機器上的情況,build 命令只能從上下文中獲取文件。如果我們在 Dockerfile 的 COPY 和 ADD 命令中引用了上下文中沒有的文件,就會收到類似下面的錯誤:

與 WORKDIR 協(xié)同工作

WORKDIR 命令為后續(xù)的 RUN、CMD、COPY、ADD 等命令配置工作目錄。在設(shè)置了 WORKDIR 命令后,接下來的 COPY 和 ADD 命令中的相對路徑就是相對于 WORKDIR 指定的路徑。比如我們在 Dockerfile 中添加下面的命令:

WORKDIR /app
COPY checkredis.py .

然后構(gòu)建名稱為 testx 的容器鏡像,并運行一個容器查看文件路徑:

checkredis.py 文件就是被復(fù)制到了 WORKDIR /app 目錄下。

COPY 命令的簡單性

如果僅僅是把本地的文件拷貝到容器鏡像中,COPY 命令是最合適不過的。其命令的格式為:
COPY <src> <dest>

除了指定完整的文件名外,COPY 命令還支持 Go 風(fēng)格的通配符,比如:

COPY check* /testdir/           # 拷貝所有 check 開頭的文件
COPY check?.log /testdir/       # ? 是單個字符的占位符,比如匹配文件 check1.log

對于目錄而言,COPY 和 ADD 命令具有相同的特點:只復(fù)制目錄中的內(nèi)容而不包含目錄自身。比如我們在 Dockerfile 中添加下面的命令:

WORKDIR /app
COPY nickdir .

其中 nickdir 目錄的結(jié)構(gòu)如下:

重新構(gòu)建鏡像 testx,運行一個容器并查看 /app 目錄下的內(nèi)容:

這里只有 file1 和 file2,少了一層目錄 nickdir。如果想讓 file1 和 file2 還保存在 nickdir 目錄中,需要在目標(biāo)路徑中指定這個目錄的名稱,比如:

WORKDIR /app
COPY nickdir ./nickdir

COPY 命令區(qū)別于 ADD 命令的一個用法是在 multistage 場景下。關(guān)于 multistage 的介紹和用法請參考筆者的《Dockerfile 中的 multi-stage》一文。在 multistage 的用法中,可以使用 COPY 命令把前一階段構(gòu)建的產(chǎn)物拷貝到另一個鏡像中,比如:

FROM golang:1.7.3
WORKDIR /go/src/github.com/sparkdevo/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go    .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/sparkdevo/href-counter/app .
CMD ["./app"]

這段代碼引用自《Dockerfile 中的 multi-stage》一文,其中的 COPY 命令通過指定 --from=0 參數(shù),把前一階段構(gòu)建的產(chǎn)物拷貝到了當(dāng)前的鏡像中。

ADD 命令還可以干其它事情

ADD 命令的格式和 COPY 命令相同,也是:

ADD <src> <dest>

除了不能用在 multistage 的場景下,ADD 命令可以完成 COPY 命令的所有功能,并且還可以完成兩類超酷的功能:

•解壓壓縮文件并把它們添加到鏡像中
•從 url 拷貝文件到鏡像中

當(dāng)然,這些功能也讓 ADD 命令用起來復(fù)雜一些,不如 COPY 命令那么直觀。

解壓壓縮文件并把它們添加到鏡像中

如果我們有一個壓縮文件包,并且需要把這個壓縮包中的文件添加到鏡像中。需不需要先解開壓縮包然后執(zhí)行 COPY 命令呢?當(dāng)然不需要!我們可以通過 ADD 命令一次搞定:

WORKDIR /app
ADD nickdir.tar.gz .

這應(yīng)該是 ADD 命令的最佳使用場景了!

從 url 拷貝文件到鏡像中

這是一個更加酷炫的用法!但是在docker 官方文檔的最佳實踐中卻強烈建議不要這么用?。ocker 官方建議我們當(dāng)需要從遠程復(fù)制文件時,最好使用 curl 或 wget 命令來代替 ADD 命令。原因是,當(dāng)使用 ADD 命令時,會創(chuàng)建更多的鏡像層,當(dāng)然鏡像的 size 也會更大(下面的兩段代碼來自 docker 官方文檔):

ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all

如果使用下面的命令,不僅鏡像的層數(shù)減少,而且鏡像中也不包含 big.tar.xz 文件:

RUN mkdir -p /usr/src/things \
    && curl -SL http://example.com/big.tar.xz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all

好吧,看起來只有在解壓壓縮文件并把它們添加到鏡像中時才需要 ADD 命令!

加速鏡像構(gòu)建的技巧

在使用 COPY 和 ADD 命令時,我們可以通過一些技巧來加速鏡像的 build 過程。比如把那些最不容易發(fā)生變化的文件的拷貝操作放在較低的鏡像層中,這樣在重新 build 鏡像時就會使用前面 build 產(chǎn)生的緩存。比如筆者構(gòu)建鏡像時需要用到下面幾個文件:

其中 myhc.py 文件不經(jīng)常變化,而 checkmongo.py、checkmysql.py 和 checkredis.py 這三個文件則經(jīng)常變化,那么我們可這樣來設(shè)計 Dockerfile 文件:

WORKDIR /app
COPY myhc.py .
COPY check* ./

讓 COPY myhc.py . 單獨占據(jù)一個鏡像層,當(dāng) build 過一次后,每次因 checkmongo.py、checkmysql.py 和 checkredis.py 這三個文件變化而導(dǎo)致的重新 build 都不會重新 build COPY myhc.py . 鏡像層:

如上圖所示,第二步和第三步都沒有重新 build 鏡像層,而是使用了之前的緩存,從第四步才開始重新 build 了鏡像層。當(dāng)文件 size 比較大且文件的數(shù)量又比較多,尤其是需要執(zhí)行安裝等操作時,這樣的設(shè)計對于 build 速度的提升還是很明顯的。所以我們應(yīng)該盡量選擇能夠使用緩存的 Dockerfile 寫法。

總結(jié)

當(dāng)?shù)谝淮慰吹?COPY 和 ADD 命令時不免讓人感到疑惑。但分析之后大家會發(fā)現(xiàn) COPY 命令是為最基本的用法設(shè)計的,概念清晰,操作簡單。而 ADD 命令基本上是 COPY 命令的超集(除了 multistage 場景),可以實現(xiàn)一些方便、酷炫的拷貝操作。ADD 命令在增加了功能的同時也增加了使用它的復(fù)雜度,比如從 url 拷貝壓縮文件時弊大于利。希望本文能夠解去大家對 Dockerfile 中 COPY 和 ADD 命令的疑惑。

參考:

Docker COPY: Dockerfile best practices

Best practices for writing Dockerfiles

Dockerfile COPY

Dockerfile ADD

以上所述是小編給大家介紹的Dockerfile 中的 COPY 與 ADD 命令,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Docker容器網(wǎng)絡(luò)更改的實現(xiàn)

    Docker容器網(wǎng)絡(luò)更改的實現(xiàn)

    本文主要介紹了Docker容器網(wǎng)絡(luò)更改的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 告別Docker請求超時之一步步排查與詳細解決方案

    告別Docker請求超時之一步步排查與詳細解決方案

    在Ubuntu系統(tǒng)上安裝Docker后,運行docker?run?hello-world時遇到連接超時問題,下面這篇文章主要介紹了Docker請求超時一步步排查與詳細解決方案的相關(guān)資料,需要的朋友可以參考下
    2025-02-02
  • Docker內(nèi)如何更新Jenkins

    Docker內(nèi)如何更新Jenkins

    本文詳細介紹了如何在Docker中使用Jenkins,包括Jenkins的基本概念、準(zhǔn)備工作、下載和運行Jenkins、通過docker-compose部署Jenkins以及更新Jenkins的步驟
    2024-11-11
  • docker倉庫登錄及配置insecure-registries的方法

    docker倉庫登錄及配置insecure-registries的方法

    這篇文章主要介紹了docker倉庫登錄配置insecure-registries的方法,docker客戶端如果配置中添加了insecure-registary配置,就不需要在docker 客戶端配置上對應(yīng)證書,如果不配置要在/etc/docker/certs.d/目錄中添加對應(yīng)證書才能正常登錄,感興趣的朋友跟隨小編一起看看吧
    2022-07-07
  • Docker下利用jenkins和docker實現(xiàn)持續(xù)交付

    Docker下利用jenkins和docker實現(xiàn)持續(xù)交付

    這篇文章主要介紹了利用jenkins和docker實現(xiàn)持續(xù)交付功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • 關(guān)于構(gòu)建aarch64環(huán)境Mysql8.0的Docker鏡像問題

    關(guān)于構(gòu)建aarch64環(huán)境Mysql8.0的Docker鏡像問題

    這篇文章主要介紹了構(gòu)建aarch64環(huán)境Mysql8.0的Docker鏡像,需要的朋友可以參考下
    2022-04-04
  • Docker使用Prune命令清理none鏡像

    Docker使用Prune命令清理none鏡像

    本文主要介紹了Docker使用Prune命令清理none鏡像,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • docker-compose部署Yapi的方法

    docker-compose部署Yapi的方法

    這篇文章主要介紹了docker-compose部署Yapi,需要的朋友可以參考下
    2022-04-04
  • docker部署kafka的方法步驟

    docker部署kafka的方法步驟

    本文主要介紹了docker部署kafka的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Docker?AIGC等大模型深度學(xué)習(xí)環(huán)境搭建步驟最新詳細版

    Docker?AIGC等大模型深度學(xué)習(xí)環(huán)境搭建步驟最新詳細版

    這篇文章主要介紹了Docker?AIGC等大模型深度學(xué)習(xí)環(huán)境搭建步驟最新詳細版,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05

最新評論