2016-09-15 25 views
7

Potrzebuję utworzyć obraz Docker (i w konsekwencji kontenery z tego obrazu), które używają dużych plików (zawierających dane genomowe, osiągając rozmiar ~ 10 GB).Ogromne pliki w kontenerach Docker

Jak mam zoptymalizować ich użycie? Czy mam je zawrzeć w kontenerze (takim jak COPY large_folder large_folder_in_container)? Czy istnieje lepszy sposób odwoływania się do takich plików? Chodzi o to, że brzmi to dziwnie, gdybym wepchnął taki kontener (który byłby> 10 GB) do mojego prywatnego repozytorium. Zastanawiam się, czy istnieje sposób dołączenia do pojemnika pewnego rodzaju objętości, bez pakowania wszystkich tych GB-ów razem.

Dziękuję.

Odpowiedz

5

Czy mam je uwzględnić w kontenerze (np. COPY large_folder large_folder_in_container)?

Jeśli tak, to by uwzględnić je w obrazu nie pojemnik: można uruchomić 20 pojemników z tego obrazu, rzeczywistej przestrzeni dyskowej używany nadal będzie 10 GB.

Jeśli chcesz zrobić inny obraz z pierwszego obrazu, warstwowy system plików ponownie użyje warstw z obrazu macierzystego, a nowy obraz będzie nadal "tylko" 10 GB.

+0

Jest to na pewno przydatne. Ale martwię się o uszczęśliwiony system, kiedy idę i wyskakuje obraz z rejestru (aby uruchomić kontener). Próbuję dopasować to do rurociągu CI/CD, który wymagałby (podczas fazy wdrażania) załadowania kontenera na nową instancję OpenStack (poprzez Packer). Ponieważ taka instancja jest zawsze inna, wymagałoby to za każdym razem, gdy przechodzę przez potok CD, aby załadować ogromny kontener do nowo utworzonej instancji OpenStack (bez wcześniej załadowanej warstwy), a tym samym do przenoszenia 10 GB przy każdym zatwierdzeniu. Czy to najlepsze rozwiązanie, jakie można znaleźć? – Eleanore

+0

@Eananore Po załadowaniu obrazu do lokalnego rejestru dokowania twojego urządzenia podrzędnego kontener rozpoczyna się natychmiast. Ale jeśli obraz się zmienia, najlepiej byłoby budować przyrostowo nowy obraz oparty na poprzednim obrazie i uwzględniać tylko zmiany. Biorąc to pod uwagę, jeśli * wszystkie * 10 GB zmienia się z jednego obrazu na następny ... masz rzeczywiście problem. – VonC

4

Czy istnieje lepszy sposób odwoływania się do takich plików?

Jeśli masz już jakiś sposób na dystrybucję danych, użyłbym "wiązania bindowania" w celu dołączenia woluminu do kontenerów.

docker run -v /path/to/data/on/host:/path/to/data/in/container <image> ... 

W ten sposób można zmienić obraz i za każdym razem nie trzeba będzie ponownie pobierać dużego zestawu danych.

Jeśli chcesz korzystać z rejestru, aby rozprowadzić duży zestaw danych, ale chcesz zarządzać zmiany danych określonych osobno, można użyć pojemnika głośności dane z Dockerfile jak ten:

FROM scratch 
COPY dataset /dataset 
VOLUME /dataset 

Od Twój kontener aplikacji można dołączyć tę głośność za pomocą:

docker run -d --name dataset <data volume image name> 
docker run --volumes-from dataset <image> ... 

czy inaczej, myślę https://docs.docker.com/engine/tutorials/dockervolumes/ to, co chcesz.