2017-01-09 13 views
5

Muszę utworzyć plik dokowania, który skopiuje katalog MyApp do obrazu.Kopiowanie katalogu do obrazu w doku podczas pomijania pod podkatalogów

MyApp 
    -libs 
    -classes 
    -resources 

katalogu Libs ma około 50 MB i nie jest często zmieniających gdzie jako klasy katalogu jest około 1 MB i jest poddawany częstym zmianom. Aby zoptymalizować kompilację dockera, planowałem dodać katalog Libs na początku pliku Dockerfile i dodać inne katalogi na końcu pliku Dockerfile. Moje obecne podejście jest jak ten

ADD MyApp/libs /opt/MyApp/libs 
## do other operations 
ADD MyApp/classes /opt/MyApp/resources 
ADD MyApp/classes /opt/MyApp/classes 

To nie jest formatem utrzymaniu jak w przyszłości może mam trochę inne katalogi w katalogu MojaApl być kopiowane do obrazu Döcker. Moim celem jest, aby zapisać plik Döcker jak ten

ADD MyApp/libs /opt/MyApp/libs 
## do other operations 
ADD MyApp -exclude MyApp/libs /opt/MyApp 

Czy istnieje podobna komenda wykluczyć pewne pliki w katalogu, który jest kopiowany na obraz Döcker?

+0

Zobacz plik .dockerignore, zobacz dok https://docs.docker.com/engine/reference/builder/ – user2915097

+0

W jaki sposób w tym przypadku pomoże plik ".dockerignore"? Chce skopiować ten sam katalog podstawowy w dwóch punktach skryptu, po prostu katalogu 'lib', po raz drugi bez katalogu' lib'. – nwinkler

Odpowiedz

2

Rozważyłem metodę wyjaśnioną przez @nwinkler i dodałem kilka kroków, aby kompozycja stała się spójna.

Teraz moja kontekst struktura katalogów jest następująca

-Dockerfile 
-MyApp 
    -libs 
    -classes 
    -resources 
-.dockerignore 
-libs 

skopiowane do katalogu libs do zewnętrznego katalogu MojaApl. Dodano plik .dockerignore który zawiera następującą linię

MyApp/libs/* 

zaktualizowała Dockerfile jak ten

ADD libs /opt/MyApp/libs 
## do other operations 
ADD MyApp /opt/MyApp 

Ponieważ dockerignore plik ignoruje katalog myapp/lib, nie ma ryzyka nadmiernego pisania katalogu libs mam skopiowane wcześniej.

+0

To wygląda dobrze! – nwinkler

1

Nie jest to możliwe po wyjęciu z pudełka z aktualną wersją Docker. Używanie pliku .dockerignore również nie będzie działać, ponieważ zawsze wyklucza folder libs.

Co można zrobić jest zawijany swoją docker build w powłoce skrypt i skopiować folder MyApp (minus folder libs) oraz folder libs w katalogach tymczasowych przed wywołaniem docker build.

coś takiego:

#!/usr/bin/env bash 
rm -rf temp 
mkdir -p temp 

# Copy the whole folder 
cp -r MyApp temp 

# Move the libs folder up one level 
mv temp/MyApp/libs temp 

# Now build the Docker image 
docker build ... 

Następnie można zmienić Dockerfile skopiować z katalogu temp:

ADD temp/libs /opt/MyApp/libs 
## do other operations 
ADD temp/MyApp /opt/MyApp 

Istnieje ryzyko, że druga komenda ADD usunie folder /opt/MyApp/libs od obraz. W takim przypadku może być konieczne odwrócenie poleceń ADD i dodanie folderu libs po wszystkim innym.

+0

Chcę dodać katalog libs na samym początku pliku Docker, ponieważ potrzebuję zoptymalizować plik Dockerfile, aby wygenerować zmiany o minimalnej wielkości, jeśli wymagana jest aktualizacja MyApp. Osiągnąłem to samo z nieco odmiennym podejściem. Mogę dodać to jako odpowiedź. – Dimuthu