Jaki jest cel „builder docker -pull”?

17

Podczas tworzenia obrazu dokera zwykle używasz docker build ..

Ale odkryłem, że możesz określić --pull, aby wyglądało całe poleceniedocker build --pull .

Nie jestem pewien celu --pull. Oficjalna dokumentacja Dockers mówi „Zawsze próbuj pobrać nową wersję obrazu” i nie jestem pewien, co to oznacza w tym kontekście.

Używasz go docker builddo zbudowania nowego obrazu i ostatecznie opublikowania go gdzieś w rejestrze kontenera. Dlaczego chcesz wyciągnąć coś, co jeszcze nie istnieje?

Spodziewałbym się, że coś tak „prostego” można łatwo znaleźć w Internecie, ale nikt nie wydaje się mieć podobnych pytań jak to. Jedyny prawdziwy hit w Google odnosi się do oficjalnych dokumentów Dockers, których ja (jak wspomniano powyżej) nie rozumiem.

Dzięki za pomoc!

Jim Aho
źródło

Odpowiedzi:

17

spowoduje pobranie najnowszej wersji dowolnego obrazu podstawowego zamiast ponownego użycia tego, co już oznaczono lokalnie

weźmy na przykład obraz oparty na ruchomym znaczniku (np. ubuntu:bionic). Upstream wprowadza zmiany i przebudowuje to okresowo, ale możesz mieć lokalny obraz sprzed kilku miesięcy. doker z radością zbuduje na starej bazie. --pullbędzie działać jako efekt uboczny, dzięki czemu zbudujesz na podstawie najnowszego obrazu podstawowego

~ zwykle najlepszą praktyką jest użycie go, aby uzyskać poprawki bezpieczeństwa tak szybko, jak to możliwe (zamiast używania starych, potencjalnie wrażliwych obrazów). choć musisz odmienić przełomowe zmiany (a jeśli używasz niezmiennych tagów, to nie ma znaczenia)

Anthony Sottile
źródło
Jest to bardzo dobre wytłumaczenie dla ubuntu:bionicobrazu, ponieważ (oczywiście) nie ma dołączonej wersji, ale nadal będzie różny, gdy opublikują nowy obraz. Wszystko ma sens. Dzięki!
Jim Aho
1
Jeśli ubuntu:0.1.0na przykład obraz podstawowy byłby opublikowany i opublikował nowy obraz, ale w tej samej wersji, tj. ubuntu:0.1.0- czy to oznacza, docker build --pullże ponownie pobierze cały nowy obraz? (jak sądzę większość ludzi woli)
Jim Aho
Mam nadzieję, że ktoś wyjaśni ostatnie pytanie z @JimAho, ponieważ to też chcę lepiej zrozumieć. Jeśli obraz został właśnie wypchnięty i nic innego się nie zmieniło, to czy nie jest tak, że nie został odbudowany?
learning2learn
2
@ learning2learn odpowiedź brzmi tak, znacznik obrazu dokera jest po prostu łańcuchem, więc „0.1.0” nie różni się od przykładu w odpowiedzi „bionic”
Anthony Sottile
@AnthonySottile Dziękujemy. bardzo.
learning2learn
1

Prosta odpowiedź. docker buildsłuży do kompilacji z lokalnego pliku docker. docker pullsłuży do ściągania z piasty dokera. Jeśli używasz kompilacji dokera bez pliku dokowania, generuje to błąd.

Po określeniu --pulllub :latestdoker spróbuje pobrać najnowszą wersję (jeśli istnieje)

Zasadniczo, jeśli dodasz --pull, będzie próbował pobrać najnowszą wersję przy każdym uruchomieniu.

DuDoff
źródło
Jeśli masz warstwowe obrazy - czy to zawsze pociągnie je wszystkie ?
Jim Aho
Jeśli masz obrazy warstwowe, niektóre zostaną zapisane w pamięci podręcznej na komputerze (starsze warstwy), a wszystkie nowe warstwy zostaną wyciągnięte.
DuDoff,
0

Docker pozwala przekazać  --pull flagę  docker buildnp  docker build . --pull -t myimage. Jest to zalecany sposób zapewnienia, że ​​kompilacja zawsze używa najnowszego obrazu kontenera, pomimo wersji dostępnej lokalnie. Warto jednak wspomnieć o jednym dodatkowym punkcie:

Aby upewnić się, że kompilacja została całkowicie przebudowana, w tym sprawdzenie obrazu podstawowego w poszukiwaniu aktualizacji, podczas budowania użyj następujących opcji:

--no-cache - Wymusi to przebudowę już dostępnych warstw.

Pełne polecenie będzie zatem wyglądać następująco:

docker build . --pull --no-cache --tag myimage:version

Te same opcje są dostępne dla docker-compose:

docker-compose build --no-cache --pull

na razie
źródło
Podczas normalnego użytkowania nie powinno być potrzebne --no-cache. Jeśli obraz podstawowy zostanie zaktualizowany (i --pullotrzyma nową wersję), to automatycznie unieważnia pamięć podręczną; podobnie jeśli użyjesz COPYinnego kodu, który unieważni pamięć podręczną. Jedyne, co zwykle będzie miało to wpływ, to jeśli robisz coś apt-get installz pakietu hostowanego w sieci, w którym to przypadku --no-cachesprawi, że sprawdzi, czy jest nowsza wersja, nawet jeśli obraz podstawowy nie został zaktualizowany.
David Maze