簡體   English   中英

在 Mac OS X 上從 Docker 層復制出文件樹

[英]Copy out file tree from Docker layers on Mac OS X

我對 Docker 容器進行了一些本地更改並commit了它們,現在我正在嘗試在構建未來實例時復制它們。 但是,事實證明很難檢查進行了哪些具體更改。 我知道包含更改的層,但現有工具(例如wagoodman/dive )不能很好地檢測到這種類型的更改。

這些層存儲在/var/lib/docker/overlay2/中,但我在 Mac OSX 上,它不作為文字路徑存在,必須通過連接到容器中的虛擬文件系統來訪問。 這可以通過一種變通方法來實現,但是這種方法以只讀方式打開文件系統並且它缺少大多數工具:

docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh

我已經使用它來驗證圖層是否大致符合我的預期。 為了更詳細地查看,我想通過docker cp將文件樹提取到我的工具所在的主文件系統。 nsenter調用作為容器festive_lehmann運行,在那個 session 中我在/var/lib/docker/overlay2/be90015c1ff3efd16d145dc079edc78b5ee59f65b947b68c06b0c4885bbf9d84/diff/ d84 打開了 shell 但是,另一個 session 中的docker cp會產生此錯誤:

$ docker cp festive_lehmann:/var/lib/docker/overlay2/be90015c1ff3efd16d145dc079edc78b5ee59f65b947b68c06b0c4885bbf9d84/diff/. ./diff/
Error: No such container:path: festive_lehmann:/var/lib/docker/overlay2/be90015c1ff3efd16d145dc079edc78b5ee59f65b947b68c06b0c4885bbf9d84/diff

我檢查過這不是特定於復制目錄的:

$ docker cp festive_lehmann:/var/lib/docker/overlay2/be90015c1ff3efd16d145dc079edc78b5ee59f65b947b68c06b0c4885bbf9d84/link .
Error: No such container:path: festive_lehmann:/var/lib/docker/overlay2/be90015c1ff3efd16d145dc079edc78b5ee59f65b947b68c06b0c4885bbf9d84/link

由於我確實在該路徑上打開了一個 shell,我認為這是正常操作無法訪問容器的某種問題,同樣的事情使得有必要使用神秘的nsenter技巧來連接它。 但我實際上並不理解這些技巧,並且docker cp不接受相關標志( -i-t--privileged--pid )。 是否有正確的調用或解決方法?

docker cp命令正在從容器命名空間內的容器文件系統進行復制。 nsenter命令正在更改您的命名空間,因此您在從 shell 運行的命令中不再看到容器文件系統。

如果您想查看這些更改,我的建議是使用dive工具,或者您可以使用docker save以將圖像內容保存到包含 tar+gzip 層 blob 的 tar 文件。 剖析該結構並不太難,您會在頂部看到一個 json 文件,它指示您找到每一層的名稱,並且可以使用 tar 命令提取這些文件(例如tar -xzvf $blob_name -C $extract_dir )。

另一種選擇是啟動如下命令:

docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i \
  tar -cf /var/lib/docker/overlay2/be90015c1ff3efd16d145dc079edc78b5ee59f65b947b68c06b0c4885bbf9d84/diff \
  | tar -xvf -

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM