2014-09-23 119 views
20

有時在構建Docker鏡像時需要使用敏感數據。例如,用於下載遠程文件或從私有存儲庫安裝依賴項的API令牌或SSH密鑰。分發產生的圖像並省略用於構建它的敏感憑據可能是可取的。如何才能做到這一點?如何在構建Docker鏡像時習慣性地訪問敏感數據?

我看過docker-squash可以將多個圖層壓縮到一個,從最終圖像中刪除任何已刪除的文件。但是有沒有更習慣的方法?

回答

4

關於習慣用法,我不確定,儘管碼頭人員仍然很年輕,有太多的成語。

但是,我們在我們公司有這個相同的問題。我們得出以下結論,儘管這是我們最好的努力,而不是建立在碼頭最佳實踐。

1)如果您在構建時需要這些值:在構建上下文中提供一個屬性文件,其值可以在構建時讀取,然後可以在構建後刪除屬性文件。這不是可移植的,但會完成這項工作。

2)如果您在運行時需要這些值:將值作爲環境變量傳遞。對於有機會訪問ps的人來說,他們是可見的,但這可以通過SELinux或其他方法來限制(老實說,我不知道這個過程,我是一個開發人員,操作團隊會處理那部分)。

+3

關於1,問題是,當將圖像推送到索引(Docker hub,quay.io等)時,圖像的所有圖層都會被推入,包括具有屬性文件的圖層。任何抽取該圖像的人都可以使用仍具有屬性文件的圖層來啓動容器,並查看敏感變量。 – 2014-09-24 17:14:02

+0

好的 - 道歉。我以爲你指的是共享一個構建文件(其他人可以構建並在構建時提供他們自己的屬性文件)。 – 2014-09-25 08:21:44

+10

如果在單個'RUN'命令中下載某個文件,根據其內容執行任何您需要的操作並最終刪除該文件,則下載的文件將不會被提交到一個圖層中。它必須在一個「RUN」命令中 – Thomasleveil 2014-09-27 00:45:14

0

我們解決這個問題的方法是我們有一個寫在docker build之上的工具。一旦您使用該工具啓動構建,它將下載dockerfile並更改它。它改變需要「祕密」要像所有的指令:

RUN printf "secret: asd123poi54mnb" > /somewhere && tool-which-uses-the-secret run && rm /somewhere 

然而,這留下提供給任何人的祕密數據和訪問圖像,除非該層本身具有像搬運工,壁球工具取出。用於生成每個中間層的命令可以使用the history command

0

Matthew Close在this blog article中對此進行了說明。

總結:您應該使用docker-compose將敏感信息安裝到容器中。

+0

看起來你發佈的鏈接不起作用。 – 2017-06-29 22:13:30

+0

@BenWhaley修復。謝謝你讓我知道。 – Xaser 2017-06-29 22:18:26

相關問題