2016-05-13 38 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