2017-03-04 75 views
4

當我從存儲庫中獲取docker鏡像時,看到它用一些id拉動了一堆圖層,但是當我嘗試運行它們時使用docker run它告訴我它無法找到它。我可以運行泊塢窗圖像的中間層嗎?

我的問題是這樣的,我可以運行一個碼頭工人形象,我可以通過搬運工歷史< image_id>看到,像古生物學家挖掘發現一些有趣的某一層?

我的嘗試:

docker pull ruby 
Using default tag: latest 
latest: Pulling from library/ruby 
693502eb7dfb: Already exists 
081cd4bfd521: Already exists 
5d2dc01312f3: Already exists 
54a5f7da9a4f: Pulling fs layer 
168cf3f33330: Pulling fs layer 
021d84fef638: Pulling fs layer 
168c3c107cd1: Waiting 
f001b782a027: Waiting 

則:

docker run --rm -it 5d2dc01312f3 bash 
Unable to find image '5d2dc01312f3:latest' locally 

問題POP操作對我來說,當我拖着,我有建立和發佈,我可以清楚地看到它的形象,一層幾乎有1.2go的大小,這是我從我用來建立圖像的機器複製一些文件的層,並在下一層我清理並刪除了一些這些文件,因爲我正在清潔圖像,但總大小圖像是一個回合1.5go這意味着大脂肪層是1.2go在那裏,我只是想看看我是否可以窺視到那個脂肪層。

+0

大發文件閱讀更多關於層上肯定是存在的因爲它是在一個圖層(dockerfile命令)中添加的,並在另一圖層中刪除。 Docker不支持在同一圖層中運行多個命令,但他們有一個實驗性的'build --squash'選項來壓縮圖像層。查看https://docs.docker.com/engine/reference/commandline/build/#squash-an-images-layers-squash-experimental-only –

回答

1

是的,這是可能的,但是如果你使用docker> = 1.10只有自建圖像。例如docker history ruby將會輸出<missing>用於除最上層以外的所有層,因爲它們沒有標籤。如果你自己構建它們,它們將會有一個標籤,你可以像正常一樣啓動它們。

+0

我知道這種可能性時,做一個本地構建中間層將是緩存在本地,但如果我從回購中獲取Docker鏡像,並且我確信在一層中有一些文件在下一層被刪除。是不是有可能只運行該特定層和以前的那些並獲取這些資源,我將更新我的問題 – achabahe

+0

確定這是可能的創建一些元數據,但我不知道究竟如何 – Julian

+0

是啊,這是可能的,因爲我認爲,因爲文件系統層超越 – achabahe

1

不,你不能運行一個圖層,你只能運行一個圖像。因此,它取決於是否存在與此圖層相關的中間圖像!

下面是一個典型場景:

  1. 你的主機上構建一個圖像:中間圖像將 這一層創建(這是碼頭工人建造完成緩存)
  2. 你將圖像推送到註冊表:僅推送最終圖像(引用所有圖層),但沒有推送任何中間圖像。
  3. 您將圖像拖放到另一臺主機上:最終圖像(包含所有圖層)現在可在該其他碼頭主機上使用。您可以通過運行來顯示其圖層docker history <image-id>

您拉動圖像時看到的摘要是圖層的摘要,它們不是中間圖像。

docker history輸出圖像列中的值<missing>意味着沒有圖像與這些圖層相關聯,因此沒有什麼可以真正運行。

的碼頭工人守護進程將不允許訪問這些層,除非像建同泊塢窗主機(或docker cache was distributed

您可以在explaining-docker-image-ids

+0

我明白你man中間圖像將無法在其他主機訪問,如果圖像被歪曲到註冊表並拉入其他主機,但我的問題是有可能訪問發佈的泊塢窗上的一些中間層圖片,我認爲這是可能的,因爲這是如何碼頭工程,我只想知道是否有辦法手動做到這一點,你感覺我 – achabahe

+0

我認爲我們需要一個碼頭黑客直接解決東西 – achabahe

+0

@achabahe我是不知道我是否明白「發佈的碼頭圖片」的含義。如果沒有與該圖層相關的圖像,是否指圖層? –