2016-05-13 7 views
5

mam tego polecenia curl w moim Dockerfile:OpenShift 3.1 - Zapobieganie Docker od buforowanie curl zasobu

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

Pierwszy raz prowadził ją mogę zobaczyć informacje o pobieraniu. Jednak po tym zdaje się buforować zdalny zasób i tym samym nie aktualizować go:

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 

Jak mogę temu zapobiec?

Odpowiedz

7

Zgodnie z docs OpenShift (https://docs.openshift.com/enterprise/3.1/dev_guide/builds.html#no-cache) można wymusić buduje się nie być buforowane przy użyciu następującej składni:

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

To będzie oznaczać, że żadne kroki są buforowane, co uczyni twój buduje wolniej, ale będzie oznaczać masz poprawną wersję artefakt w swojej budowie.

5

Możesz zbankrutować pamięć podręczną na konkretnej instrukcji Dockerfile używając ARG.

W Dockerfile:

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

W wierszu poleceń:

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

Setting CACHEBUST do chwili obecnej oznacza, że ​​zawsze będzie wyjątkowy, a instrukcje po deklaracji ARG w Dockerfile nie zostanie zbuforowany. Zauważ, że możesz także budować bez określania build-arg CACHEBUST, co spowoduje, że użyje domyślnej wartości 1 i zachowa pamięć podręczną. Może to być wykorzystywane, aby zawsze sprawdzić świeże kopie repo git pociągnąć najnowsze zależności migawki itp

Source

również:

Można użyć --no- pamięć podręczną lub --build-arg, aby unieważnić pamięć podręczną. Ty możesz zminimalizować efekt --no-cache poprzez posiadanie podstawowego obrazu ze wszystkimi komendami cacheable.

Source

+0

Nie mogę kontrolować sposobu uruchamiania okna dokowanego, chodzi mi o to, że uruchamiam program PaaS, który wywołuje mój plik dokowany, więc nie mogę przekazywać argumentów w kompilacji doków ... – codependent

+0

Daję ci +1 jako najlepszą czystą odpowiedź Docker – codependent

+0

Więc kiedy uruchomić z powłoki jest różnica między używaniem CACHEBUST vs --no-cache? Mój plik docker (pośrednio) klonuje gałąź oddzielnego repozytorium git, które aktywnie zmieniam. (Aby być całkowicie dokładnym, nie klonuje się bezpośrednio do drugiego repo, ale zainstaluje go.) Chciałbym warunkowo zniszczyć pamięć podręczną, najlepiej tylko dla warstwy, która dodaje to oddzielne repo, gdy tylko zmieni się HEAD w zdalnym oddziale. Myślałem o dynamicznym pobieraniu skrótu zatwierdzenia HEAD z GitHub i przechowywania go w pliku, który został dodany nad poleceniem ADD dla repo, ale czuje się zjadliwy ze wspólnego scenariusza. –

0

nie mogę kontrolować sposób doker jest uruchamiany, to znaczy ja pracuje w PaaS, który wywołuje mój dockerfile więc nie mogę przekazywać argumenty w dokowanym budować

Możesz jednak spróbować kontrolować zawartość pliku Dockerfile.

Jeśli można ponownie wygenerować Dockerfile przed pozwalając PaaS nazywając ją, że pomogłoby upewniając się, że skrzynka jest unieważniona:

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

Niestety nie mogę tego zrobić. Serwer PaaS otrzymuje mój plik Dockerfile z repozytorium Git – codependent

+0

@codependent Co * możesz * zrobić, a następnie? – VonC

+0

@codependent można go przekazać do repozytorium git? – VonC