#docker #dockerfile
#docker #dockerfile
Вопрос:
Я создаю образ docker как часть автоматической сборки, и я хочу удалить созданный мной образ и все последующие изображения, связанные со встроенным образом.
Я могу легко удалить созданный образ, указав имя и тег (потому что я могу получить эти данные через переменные). Но как мне удалить любые дополнительные изображения, которые загружаются Dockerfile? (В частности, используя FROM
ключевое слово, поскольку в одном Dockerfile может быть несколько FROM
вызовов).
Например, у меня есть изображение, которое извлекается python:2.7.16-alpine
из своего Dockerfile. Если я начну без изображений в системе, при запуске docker build -f path/to/Dockerfile
у меня останутся два образа: generated-docker-image:tag
и python:2.7.16-alpine
.
Предполагая, что процесс выполняется в системе, в которой могут быть другие образы docker, которые я не хочу удалять, как мне программно удалить только мой образ и связанные с ним изображения?
Ответ №1:
Я думаю, вы можете использовать docker history
(Показать историю изображения), чтобы найти все изображения, связанные с последним. Я хочу сообщить вам, что это решение не работает для многоступенчатых сборок, потому что в конечном изображении есть только ссылки на изображения, которые были для него базовыми слоями.
Позвольте мне показать вам несколько примеров:
1. Мы создаем простой Dockerfile
:
FROM ubuntu:latest
RUN touch newfile
2. Создаем из него образ docker:
$ docker build -t new-image .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM ubuntu:latest
latest: Pulling from library/ubuntu
898c46f3b1a1: Pull complete
63366dfa0a50: Pull complete
041d4cd74a92: Pull complete
6e1bee0f8701: Pull complete
Digest: sha256:017eef0b616011647b269b5c65826e2e2ebddbe5d1f8c1e56b3599fb14fabec8
Status: Downloaded newer image for ubuntu:latest
---> 94e814e2efa8
Step 2/2 : RUN touch newfile
---> Running in ac93702f363b
Removing intermediate container ac93702f363b
---> 4d52ac122761
Successfully built 4d52ac122761
Successfully tagged new-image:latest
3. И теперь мы можем очистить все образы, которые использовались для сборки последнего:
$ docker history new-image:latest | awk '!/IMAGE|<missing>/ {print $1}' | xargs -I {} docker rmi {}
Untagged: new-image:latest
Deleted: sha256:4d52ac122761ec1ba9f3d77606c49f98cf8c7d728d60834a87f25cede39a2027
Deleted: sha256:7f62b9533dbd6514fe0cb7f4ddc3086ad5ae45fe1c13f5eeea1cc38f575e92bd
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:017eef0b616011647b269b5c65826e2e2ebddbe5d1f8c1e56b3599fb14fabec8
Deleted: sha256:94e814e2efa8845d95b2112d54497fbad173e45121ce9255b93401392f538499
Deleted: sha256:e783d8ee44ce099d51cbe699f699a04e43c9af445d85d8576f0172ba92e4e16c
Deleted: sha256:cc7fae10c2d465c5e4b95167987eaa53ae01a13df6894493efc5b28b95c1bba2
Deleted: sha256:99fc3504db138523ca958c0c1887dd5e8b59f8104fbd6fd4eed485c3e25d2446
Deleted: sha256:762d8e1a60542b83df67c13ec0d75517e5104dee84d8aa7fe5401113f89854d9