Chcę zbudować obraz dockera dla projektu Linkurious na github, który wymaga zarówno bazy danych Neo4j, jak i Node.js.
moim pierwszym podejściem było zadeklarowanie obrazu podstawowego dla mojego obrazu, zawierającego Neo4j. Dokumenty referencyjne nie definiują „obrazu podstawowego” w żaden pomocny sposób:
Obraz podstawowy: obraz, który nie ma elementu nadrzędnego, jest obrazem podstawowym
z którego przeczytałem, że mogę mieć tylko obraz podstawowy, jeśli ten obraz nie ma samego obrazu podstawowego.
ale co to jest obraz podstawowy? czy to oznacza, że jeśli zadeklaruję neo4j / neo4j w dyrektywie FROM, to po uruchomieniu mojego obrazu baza danych neo uruchomi się automatycznie i będzie dostępna w kontenerze na porcie 7474?
czytając odniesienie do Dockera (patrz: https://docs.docker.com/reference/builder/#from ) widzę:
FROM może pojawić się wiele razy w jednym pliku Dockerfile w celu utworzenia wielu obrazów. Po prostu zanotuj ostatnie dane wyjściowe identyfikatora obrazu przez zatwierdzenie przed każdym nowym poleceniem FROM.
chcę utworzyć wiele obrazów? wydaje się, że chcę mieć pojedynczy obraz zawierający zawartość innych obrazów, np. neo4j i node.js
Nie znalazłem żadnej dyrektywy do deklarowania zależności w podręczniku referencyjnym. czy nie ma zależności, jak w RPM, gdzie w celu uruchomienia mojego obrazu kontekst wywołujący musi najpierw zainstalować obrazy, których potrzebuje?
Jestem zmieszany...
źródło
FROM
w sposóbDockerfile
. Zobacz moją zredagowaną odpowiedź poniżej.Odpowiedzi:
Zestaw plików plus
EXPOSE
portyENTRYPOINT
iCMD
.Możesz dodawać pliki i budować nowy obraz na podstawie tego podstawowego obrazu, z nowym
Dockerfile
rozpoczynającym się odFROM
dyrektywy: obraz wspomniany poniżejFROM
jest „obrazem podstawowym” dla nowego obrazu.Tylko jeśli nie nadpiszesz
CMD
iENTRYPOINT
.Ale sam obraz wystarczy: użyłbyś
FROM neo4j/neo4j
, gdybyś musiał dodać pliki związane zneo4j
konkretnym zastosowaniemneo4j
.Nie: jest propozycja usunięcia tej „funkcji” mimo wszystko ( wydanie 13026 )W numerze 14412 wspomniano:
Zaktualizuj maj 2017 (18 miesięcy później), z dockerem (moby) 17.05-ce .
W jednym pliku Dockerfile można użyć wielu FROM .
Zobacz „ Wzorzec konstruktora a kompilacje wieloetapowe w Dockerze ” (autor: Alex Ellis ) i PR 31257 autorstwa Tõnis Tiigi .
Przed:
Po:
Pierwsza część pliku Dockerfile:
Druga część tego samego (!) Dockerfile:
Rezultatem byłyby dwa obrazy, jeden do tworzenia, a drugi tylko z wynikową aplikacją (dużo, dużo mniejszy)
źródło
Pierwsza odpowiedź jest zbyt złożona, historyczna i mało pouczająca jak na mój gust.
Właściwie jest to raczej proste. Docker zapewnia funkcjonalność zwaną wielostopniowymi kompilacjami, a podstawową ideą jest tutaj,
Zacznijmy od pierwszego. Bardzo często z czymś takim jak Debian zobaczysz.
Możemy to wszystko wyjaśnić za pomocą powyższego. Powyższe polecenie jest powiązane ze sobą, więc reprezentuje pojedynczą zmianę bez wymaganych obrazów pośrednich. Gdyby tak było napisane,
Dałoby to 3 bardziej tymczasowe obrazy pośrednie. Po zredukowaniu do jednego obrazu pozostaje jeden problem:
apt-get clean
nie czyści artefaktów używanych podczas instalacji. Jeśli opiekun Debiana włączy do swojej instalacji skrypt modyfikujący system, modyfikacja ta będzie również obecna w ostatecznym rozwiązaniu (zobacz coś podobnego,pepperflashplugin-nonfree
aby zobaczyć przykład).Korzystając z kompilacji wieloetapowej, uzyskujesz wszystkie korzyści płynące z jednej zmienionej akcji, ale będzie to wymagało ręcznego dodania do białej listy i skopiowania plików, które zostały wprowadzone do obrazu tymczasowego przy użyciu
COPY --from
udokumentowanej tutaj składni. Co więcej, jest to świetne rozwiązanie, w którym nie ma alternatywy (takiej jakapt-get clean
), a w przeciwnym razie miałbyś wiele niepotrzebnych plików w ostatecznym obrazie.Zobacz też
źródło
FROM
jest zasadniczo deklaracją przestrzeni nazw. Kwalifikator jest bardziej rozszerzeniem niż dziedziczeniem. Możesz zadeklarować wiele przestrzeni nazw. Każda z tych przestrzeni nazw może rozszerzyć jedną inną przestrzeń nazw. @ekkis Jeśli druga odpowiedź Ci odpowiada, trzymaj się jej.