Prowadzę prywatny rejestr Dockera i chcę usunąć wszystkie obrazy poza latest
repozytorium. Nie chcę usuwać całego repozytorium, tylko niektóre obrazy w nim zawarte. Dokumentacja API nie wspomina o sposobie zrobienia tego, ale na pewno jest to możliwe?
163
Odpowiedzi:
Obecnie nie można używać interfejsu API rejestru do tego zadania. Pozwala tylko na usunięcie repozytorium lub określonego tagu.
Ogólnie rzecz biorąc, usunięcie repozytorium oznacza, że wszystkie tagi powiązane z tym repozytorium zostaną usunięte.
Usunięcie tagu oznacza, że powiązanie między obrazem a tagiem zostaje usunięte.
Żadne z powyższych nie spowoduje usunięcia pojedynczego obrazu. Pozostają na twoim dysku.
Obejście problemu
Aby obejść ten sposób, musisz przechowywać obrazy Dockera lokalnie.
Rozwiązaniem byłoby usunięcie wszystkich tagów oprócz najnowszych i tym samym potencjalnie usunięcie odniesienia do skojarzonych obrazów. Następnie możesz uruchomić ten skrypt, aby usunąć wszystkie obrazy, do których nie odwołuje się żaden znacznik ani pochodzenie żadnego użytego obrazu.
Terminologia (obrazy i tagi)
Rozważmy graf obrazu takiego, gdzie litery (
A
,B
...) stanowią krótkie identyfikatory obrazu i<-
oznacza, że obraz jest oparty na innym obrazie:Teraz dodajemy tagi do zdjęcia:
Tutaj znacznik
<version1>
odwołuje się do obrazu,C
a znacznik<version2>
do obrazuD
.Udoskonalanie pytania
W swoim pytaniu powiedziałeś, że chcesz usunąć
. Otóż, ta terminologia nie jest całkiem poprawna. Pomieszałeś obrazy i tagi. Patrząc na wykres, myślę, że zgodzisz się, że tag
<version2>
reprezentuje najnowszą wersję. W rzeczywistości, zgodnie z tym pytaniem , możesz mieć tag reprezentujący najnowszą wersję:Ponieważ
<latest>
tag odnosi się do obrazuD
, pytam: czy naprawdę chcesz usunąć wszystko oprócz obrazuD
? Prawdopodobnie nie!Co się stanie, jeśli usuniesz tag?
Jeśli usuniesz tag
<version1>
za pomocą Docker REST API, otrzymasz to:Pamiętaj: Docker nigdy nie usunie obrazu! Nawet jeśli tak się stało, w tym przypadku nie można usunąć obrazu, ponieważ
C
jest on częścią pochodzenia obrazu,D
który jest oznaczony.Nawet jeśli użyjesz tego skryptu , żaden obraz nie zostanie usunięty.
Kiedy obraz można usunąć
Pod warunkiem, że możesz kontrolować, kiedy ktoś może ściągać lub przesyłać do rejestru (np. Wyłączając interfejs REST). Możesz usunąć obraz z wykresu obrazu, jeśli żaden inny obraz nie jest na nim oparty i żaden tag nie odnosi się do niego.
Zauważ, że na poniższym wykresie obraz nie
D
jest oparty na, ale na . Dlatego nie zależy od . Jeśli usuniesz tag na tym wykresie, obraz nie będzie używany przez żaden obraz i ten skrypt może go usunąć.C
B
D
C
<version1>
C
Po wyczyszczeniu wykres obrazu wygląda następująco:
Czy to jest to, czego chcesz?
źródło
Napotkałem ten sam problem z moim rejestrem, a następnie wypróbowałem poniższe rozwiązanie ze strony bloga. To działa.
Krok 1: Wystawianie katalogów
Możesz wyświetlić swoje katalogi, dzwoniąc pod ten adres:
Odpowiedź będzie w następującym formacie:
Krok 2: Wystawianie tagów dla powiązanego katalogu
Możesz wyświetlić listę tagów swojego katalogu, dzwoniąc pod ten adres:
Odpowiedź będzie w następującym formacie:
}
Krok 3. Wymień wartość manifestu dla powiązanego tagu
Możesz uruchomić to polecenie w kontenerze rejestru Dockera:
Odpowiedź będzie w następującym formacie:
Uruchom polecenie podane poniżej z wartością manifestu:
Krok 4: Usuń zaznaczone manifesty
Uruchom to polecenie w kontenerze rejestru Dockera:
Oto mój config.yml
źródło
Deleteing blob: /docker/...
”, ale nie zmieniło to używanego miejsca na dysku. Korzystanie z bin / register github.com/docker/distribution v2.4.1 .Docker-Content-Digest
częścią powinny być pisane małymi literami (testowane na Döcker v18.09.2 silnika) czylicurl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://localhost:5000/v2/<name>/manifests/<tag> 2>&1 | grep docker-content-digest | awk '{print ($3)}'
Bieżący
v2
rejestr obsługuje teraz usuwanie za pośrednictwemDELETE /v2/<name>/manifests/<reference>
Zobacz: https://github.com/docker/distribution/blob/master/docs/spec/api.md#deleting-an-image
Użycie w pracy: https://github.com/byrnedo/docker-reg-tool
Edycja:
<reference>
powyższy manifest można pobrać z prośby doGET /v2/<name>/manifests/<tag>
i sprawdzanie
Docker-Content-Digest
nagłówka w odpowiedzi.Edycja 2: Konieczne może być uruchomienie rejestru z następującym zestawem ustawień środowiska:
REGISTRY_STORAGE_DELETE_ENABLED="true"
Edit3: Być może będziesz musiał uruchomić czyszczenie pamięci, aby zwolnić to miejsce na dysku: https://docs.docker.com/registry/garbage-collection/
źródło
DELETE
.{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
Zadanie 1
Wspomniałeś, że był to twój prywatny rejestr docker, więc prawdopodobnie musisz sprawdzić Registry API zamiast dokumentu Hub Registry API , który jest podanym linkiem.
Zadanie 2
docker register API jest protokołem klient / serwer, od implementacji serwera zależy, czy usunąć obrazy z zaplecza. (Zgaduję)
Szczegółowe wyjaśnienie
Poniżej pokazuję, jak to działa teraz z twojego opisu jako mojego zrozumienia dla twoich pytań.
Uruchamiasz, uruchamiasz prywatny rejestr dockera, ja używam domyślnego i nasłuchuję na
5000
porcieNastępnie oznaczam lokalny obraz i wsuwam do niego.
Następnie możesz użyć Registry API, aby sprawdzić, czy istnieje w prywatnym rejestrze dockera
Teraz mogę usunąć tag za pomocą tego API !!
Sprawdź ponownie, tag nie istnieje na Twoim prywatnym serwerze rejestru
źródło
registry
obrazu kanonicznego . SSH i uruchamianie skryptu działa, nawet jeśli nie jest idealne. Na marginesie, nadal uważam, że jest to niekompletny interfejs API - możesz usunąć tagi, ale jeśli GET/images
, nadal widzisz wszystkie pozostałe dane obrazu.To jest naprawdę brzydkie, ale działa, tekst jest testowany w rejestrze: 2.5.1. Nie udało mi się sprawić, aby usuwanie działało płynnie nawet po zaktualizowaniu konfiguracji, aby umożliwić usuwanie. Identyfikator był naprawdę trudny do odzyskania, musiałem się zalogować, aby go uzyskać, może jakieś nieporozumienie. W każdym razie działa:
Zaloguj się do kontenera
Zdefiniuj zmienne pasujące do kontenera i jego wersji:
Przejdź do katalogu rejestru:
Usuń pliki związane z hashem:
Usuń manifesty:
Wyloguj
Uruchom GC:
Jeśli wszystko zostało wykonane poprawnie, zostaną wyświetlone informacje o usuniętych obiektach blob.
źródło
Jest kilku klientów (w Pythonie, Ruby itp.), Którzy dokładnie to robią. Jak na mój gust, instalacja środowiska wykonawczego (np. Pythona) na moim serwerze rejestru, tylko po to, aby uporządkować mój rejestr, nie jest zrównoważona!
Tak
deckschrubber
jest moje rozwiązanie:obrazy starsze niż podany wiek są automatycznie usuwane. Wiek może być określona za pomocą
-year
,-month
,-day
lub ich kombinacji:AKTUALIZACJA : oto krótkie wprowadzenie do deckschrubber.
źródło
deckschrubber
jest całkiem niezły - bardzo łatwy do zainstalowania (pojedynczy plik binarny) i pozwala usuwać obrazy według nazwy (z dopasowaniem wyrażenia regularnego), a także wieku.ERRO[0000] Could not delete image! repo=.... tag=latest
: /Krótko;
1) Musisz wpisać następujące polecenie dla RepoDigests repozytorium docker;
2) Użyj interfejsu API REST rejestru
Powinieneś otrzymać 202 Accepted dla pomyślnego wywołania.
3-) Uruchom Garbage Collector
rejestr - nazwa kontenera rejestru.
Aby uzyskać bardziej szczegółowe wyjaśnienie, wprowadź opis łącza tutaj
źródło
Ten obraz dockera zawiera skrypt bash, którego można użyć do usunięcia obrazów ze zdalnego rejestru v2: https://hub.docker.com/r/vidarl/remove_image_from_registry/
źródło
Poniżej Bash Script Usuwa wszystkie tagi znajdujące się w rejestrze oprócz najnowszych.
Po tym Run
źródło
Prosty skrypt ruby oparty na tej odpowiedzi: register_cleaner .
Możesz go uruchomić na komputerze lokalnym:
./registry_cleaner.rb --host=https://registry.exmpl.com --repository=name --tags_count=4
A następnie na komputerze rejestru usuń obiekty blob za pomocą
/bin/registry garbage-collect /etc/docker/registry/config.yml
.źródło
Oto skrypt oparty na odpowiedzi Yavuza Serta. Usuwa wszystkie tagi, które nie są najnowszą wersją, a ich tag jest większy niż 950.
źródło