2016-05-13 10 views
5

ich diesen curl Befehl habe in meinem Dockerfile:Openshift 3.1 - Prevent Docker von Cachen curl Ressource

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

Das erste Mal, dass ich es lief ich die Download-Informationen sehen kann. Jedoch nach, dass es Caching die Remote-Ressource zu sein scheint und somit die Aktualisierung es nicht mehr:

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 

Wie könnte ich dies verhindern?

Antwort

7

die Openshift docs Nach (https://docs.openshift.com/enterprise/3.1/dev_guide/builds.html#no-cache) Sie baut nicht zwingen kann, zu mit folgenden Syntax zwischengespeichert werden:

strategy: 
    type: "Docker" 
    dockerStrategy: 
    noCache: true 

Dies bedeutet, dass keine Stufen zwischengespeichert werden, was IhrFormal macht langsamer bauen aber bedeuten, dass Sie die richtige Artefakt-Version in Ihrem Build haben.

5

Sie können den Cache bei einer bestimmten Dockerfile-Anweisung mit ARG zerstören.

Im Dockerfile:

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

Auf der Kommandozeile:

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

Einstellung CACHEBUST auf die aktuelle Zeit bedeutet, dass es immer einzigartig sein wird, und Anweisungen nach der ARG-Deklaration in der Dockerfile wird nicht zwischengespeichert. Beachten Sie, dass Sie auch ohne die Angabe CACHEBUST build-arg erstellen können, die dazu führt, dass es den Standardwert von 1 verwendet und den Cache bewahrt. Dies kann verwendet werden, um immer zu überprüfen frisch Kopien von git repos, neueste SCHNAPPSCHUSS Abhängigkeiten ziehen usw.

Source

auch:

Sie verwenden --no- Cache oder --build-arg, um den Cache ungültig zu machen. Sie können den Effekt von --no-cache minimieren, indem Sie ein Basisbild mit allen die cachefähigen Befehle haben.

Source

+0

Ich kann nicht steuern, wie Docker ausgeführt wird, ich meine, ich bin in einem PaaS ausgeführt, die meine Dockerdatei aufruft, so dass ich Argumente in Docker Build nicht übergeben kann ... – codependent

+0

Ich gebe Ihnen eine +1 als die beste reine Docker Antwort – codependent

+0

Also, wenn von einer Shell ausgeführt wird gibt es einen Unterschied zwischen der Verwendung von CACHEBUST vs - no-cache? Meine Docker-Datei klont (indirekt) einen Zweig eines separaten Git-Repos, den ich aktiv verändere. (Um ganz genau zu sein, klont es nicht direkt das zweite Repo, sondern pip installiert es.) Ich möchte den Cache bedingungslos auflösen, idealerweise nur für den Layer, der diesen separaten Repo hinzufügt, wenn HEAD seines entfernten Zweigs sich ändert. Ich habe daran gedacht, den HEAD-Commit-Hash dynamisch von GitHub abzurufen und ihn in einer Datei zu speichern, die oberhalb des ADD-Befehls für den Repo hinzugefügt wurde, aber er fühlt sich für ein häufiges Szenario hacky an. –

0

ich nicht die Art und Weise Docker läuft steuern kann, ich meine ich in einem PaaS bin mit, dass mein dockerfile nennt, so kann ich nicht Argumente in Docker passieren bauen

Sie könnten jedoch versuchen, den Inhalt Ihrer Dockerfile zu steuern.

Wenn Sie es den Aufruf der Dockerfile vor dem PaaS lassen neu generieren kann, dass der Cache helfen würde sicherstellen, dass für ungültig erklärt wird:

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

Leider kann ich das auch nicht. Der PaaS-Server ruft meine Docker-Datei von einem Git-Repository ab. – codependent

+0

@codependent Was * kannst * du dann tun? – VonC

+0

@codependent kannst du es zum git repo schieben? – VonC