2016-05-13 43 views
5

我在Dockerfile有這樣的curl命令:OpenShift 3.1 - 防止碼頭工人從緩存捲曲資源

RUN curl -H 'Cache-Control: no-cache' -f ${NEXUS_URL}${ARTIFACT_PATH}-${ARTIFACT_VERSION}.war?nocache=true -o $JBOSS_HOME/standalone/deployments/ROOT.war 

我第一次跑了,我沒看到的下載信息。然而之後,似乎是緩存遠程資源,因此,不再更新它:

Step 6 : RUN curl -H 'Cache-Control: no-cache' -f ${NEXUS_URL}${ARTIFACT_PATH}-${ARTIFACT_VERSION}.war?nocache=true -o $JBOSS_HOME/standalone/deployments/ROOT.war 
30 ---> Using cache 
31 ---> be50412bf6c3 

我怎麼能防止這種情況?

回答

5

您可以使用ARG在特定的Dockerfile指令中緩存高速緩存。

在Dockerfile:

ARG CACHEBUST=1 
RUN git clone https://github.com/octocat/Hello-World.git 

在命令行:

docker build -t your-image --build-arg CACHEBUST=$(date +%s) . 

設置CACHEBUST到當前的時間意味着它永遠是 唯一的,並且在該ARG聲明之後的指令Dockerfile 不會被緩存。請注意,您也可以在不指定 CACHEBUST build-arg的情況下構建,這會使其使用默認值1 並保留緩存。這可以用來隨時檢查出的git回購新鮮 副本,拉最新快照依賴等

Source

另外:

您可以使用--no-緩存或--build-arg使緩存無效。您可以通過使用可緩存命令的全部 基礎映像來最小化--no-cache的影響。

Source

+0

我無法控制docker運行的方式,我的意思是我運行在調用dockerfile的PaaS中,因此我無法在docker構建中傳遞參數... – codependent

+0

我給你+1作爲最好的純Docker答案 – codependent

+0

因此,從shell運行時,使用CACHEBUST vs --no-cache有什麼區別?我的dockerfile(間接)克隆了一個單獨的git倉庫,我正在積極改變。 (爲了完全準確,它不是直接克隆第二個repo,但是pip正在安裝它。)我希望有條件地刪除緩存,理想情況下只適用於添加單獨repo的圖層,只要其遠程分支的HEAD發生更改。我曾經想過動態地從GitHub中獲取HEAD提交哈希,並將其存儲在一個文件中,該文件添加到了回購的ADD命令的上方,但對於常見的場景來說,它感覺很難受。 –

0

我無法控制泊塢窗的運作方式,我的意思是我在PaaS的調用我的dockerfile所以我不能傳遞參數的搬運工建立運行

雖然您可以嘗試並控制Dockerfile的內容。

讓PaaS的調用前如果可以重新生成Dockerfile,這將有助於確保高速緩存無效:

sed -i 's/ROOT.war.*/ROOT.war && echo $(date)'/g' Dockerfile 
+0

不幸的是我也做不到這一點。 PaaS服務器從Git存儲庫獲取我的Dockerfile – codependent

+0

@codependent然後?你可以做什麼? – VonC

+0

@codependent你可以把它推到git倉庫嗎? – VonC