2016-05-03 19 views
9

Ho un Dockerfile che tenta di impacchettare e distribuire un'app Web in un contenitore. Il codice dell'app si recupera dal repository git durante la creazione dell'immagine Docker. Ecco l'istantanea Dockerfile:Come impedire la memorizzazione nella cache di Dockerfile git clone

........ 
RUN git clone --depth=1 git-repository-url $GIT_HOME/ 
RUN mvn package -Dmaven.test.skip 
........ 

voglio la finestra mobile non memorizzare nella cache il passo di RUN git clone --depth=1 git-repository-url $GIT_HOME/ in modo che il continuo aggiornamento sul repository può essere riflessa sulla costruzione dell'immagine Docker. È possibile raggiungerlo?

risposta

8

Issue 1996 non è ancora disponibile, ma si ha la following workaround:

FROM foo 
ARG CACHE_DATE=2016-01-01 
RUN git clone ... 

docker build --build-arg CACHE_DATE=$(date) .... 

che potrebbero invalidare la cache dopo la riga ARG CACHE_DATE per ogni generazione.

+0

Grazie per la vostra consulenza. Ma non funziona per me poiché utilizzo una nuvola CaaS per costruire l'immagine Docker. Non c'è modo di passare argomenti docker. – Raindy

+0

non funziona per me. Docker versione 17.05.0-ce, build 89658be –

+0

@StephanRichter e https://github.com/moby/moby/pull/10682#issuecomment-178794901? – VonC

15

Un'altra soluzione:

Se si utilizza github (o gitlab o bitbucket troppo più probabile) è possibile aggiungere rappresentanza della API GitHub del pronti contro termine a una posizione fittizia.

ADD https://api.github.com/repos/$USER/$REPO/git/refs/heads/$BRANCH version.json 
    RUN git clone -b$BRANCH https://github.com/$USER/$REPO.git $GIT_HOME/ 

La chiamata a api restituirà risultati diversi quando la testina cambia, invalidando la cache della finestra mobile.

Se hai a che fare con i pronti contro termine privati ​​è possibile utilizzare github's x-oauth-basic authentication scheme con una personal access token in questo modo:

ADD https://$ACCESS_TOKEN:[email protected]/repos/$USER/$REPO/git/refs/heads/$BRANCH version.json 

(@captnolimar thx per una modifica suggerita per chiarire l'autenticazione)

2

Se si utilizza github voi può usare github API per non memorizzare nella cache il comando RUN specifico. È necessario aver installato JQ analizzare JSON: apt-get install JQ -y

Esempio:

docker build --build-arg SHA=$(curl -s 'https://api.github.com/repos/Tencent/mars/commits' | jq -r '.[0].sha') -t imageName . 

In Dockerfile (ARG comando deve essere a destra prima di RUN):

ARG SHA=LATEST 
RUN SHA=${SHA} \ 
    git clone https://github.com/Tencent/mars.git 

o se non si desidera installare jq

SHA=$(curl -s 'https://api.github.com/repos/Tencent/mars/commits' | grep sha | head -1) 

Se il repository ha nuovi commit, git clon e sarà eseguito.

0

Per GitHub pronti contro termine privati, si potrebbe anche passare il nome utente e la password:

RUN git clone -b$BRANCH https://$USER:[email protected]/$USER/$REPO.git $GIT_HOME/

+0

La tua risposta richiede la formattazione dei bit – Billa

+0

Non vorrei passare la mia password utente se permetto ai miei amministratori di clonare un solo repository. – Kangur

Problemi correlati