2016-05-13 27 views
5

ho questo comando riccio nel mio Dockerfile:OpenShift 3.1 - Prevenire Docker dal caching delle risorse ricciolo

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

La prima volta che ho fatto funzionare ho potuto vedere le informazioni di download. Tuttavia dopo che sembra essere la memorizzazione nella cache la risorsa remota e, quindi, non aggiornare faccio più:

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 

Come potrei evitare questo?

risposta

7

Secondo la documentazione OpenShift (https://docs.openshift.com/enterprise/3.1/dev_guide/builds.html#no-cache) è possibile forzare costruisce di non essere memorizzato nella cache utilizzando la seguente sintassi:

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

Ciò significa che non passi vengono memorizzati nella cache, che renderà il vostro costruisce più lento, ma significherà avere la versione manufatto corretto nel build.

5

È possibile interrompere la cache su un'istruzione Dockerfile specifica utilizzando ARG.

Nella Dockerfile:

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

Sulla riga di comando:

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

Impostazione CACHEBUST al tempo corrente significa che sarà sempre unici, e le istruzioni dopo la dichiarazione di ARG nel Dockerfile non verrà memorizzato nella cache. Si noti che è anche possibile creare senza specificare il build-arg CACHEBUST , che farà sì che utilizzi il valore predefinito di 1 e conservi la cache. Questo può essere usato per controllare sempre fuori freschi copie di pronti contro termine git, tirare tutte le dipendenze snapshot, ecc

Source

anche:

È possibile utilizzare --no- cache, o --build-arg per invalidare la cache. L'utente può minimizzare l'effetto di --no-cache avendo un'immagine di base con tutti i comandi memorizzabili nella cache di .

Source

+0

Non riesco a controllare il modo in cui viene eseguita la finestra mobile, voglio dire che sono in esecuzione in un PaaS che chiama il mio file docker in modo da non poter passare argomenti nel docker build ... – codependent

+0

Ti sto dando un +1 come la migliore risposta Docker pura – codependent

+0

Quindi quando si esegue da una shell c'è una differenza tra l'utilizzo di CACHEBUST vs --no-cache? Il mio dockerfile (indirettamente) clona un ramo di un repository git separato che sto attivamente cambiando. (Per essere completamente accurato, non sta clonando direttamente il secondo repository, ma lo sta installando.) Mi piacerebbe eseguire il bump condizionato della cache, idealmente solo per il livello che aggiunge quel repository separato, ogni volta che HEAD del suo ramo remoto cambia. Ho pensato di prelevare in modo dinamico l'hash di commit HEAD da GitHub e di memorizzarlo in un file che è stato aggiunto sopra il comando ADD per il repository, ma si sente hacky per uno scenario comune. –

0

Non riesco a controllare il modo in cui è gestito finestra mobile, voglio dire io sono in esecuzione in un PaaS che chiama il mio dockerfile quindi non posso passare gli argomenti in finestra mobile costruire

Puoi provare a controllare il contenuto del tuo Dockerfile.

Se è possibile ri-generare la Dockerfile prima di lasciare il PaaS chiamandola, che avrebbe aiutato assicurandosi che la cache viene invalidata:

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

Purtroppo non posso farlo neanche io. Il server PaaS ottiene il mio Dockerfile da un repository Git – codependent

+0

@codependent Cosa * può * fare, quindi? – VonC

+0

@codependent puoi spingerlo al repository git? – VonC