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:
A <- B <- C <- D
Teraz dodajemy tagi do zdjęcia:
A <- B <- C <- D
| |
| <version2>
<version1>
Tutaj znacznik <version1>
odwołuje się do obrazu, C
a znacznik <version2>
do obrazu D
.
Udoskonalanie pytania
W swoim pytaniu powiedziałeś, że chcesz usunąć
wszystkie obrazy oprócz latest
. 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ę:
A <- B <- C <- D
| |
| <version2>
| <latest>
<version1>
Ponieważ <latest>
tag odnosi się do obrazu D
, pytam: czy naprawdę chcesz usunąć wszystko oprócz obrazu D
? Prawdopodobnie nie!
Co się stanie, jeśli usuniesz tag?
Jeśli usuniesz tag <version1>
za pomocą Docker REST API, otrzymasz to:
A <- B <- C <- D
|
<version2>
<latest>
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 nieD
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
A <- B <--------- D
\ |
\ <version2>
\ <latest>
\ <- C
|
<version1>
Po wyczyszczeniu wykres obrazu wygląda następująco:
A <- B <- D
|
<version2>
<latest>
Czy to jest to, czego chcesz?