Как исправить docker в make-файле, который требует как минимум 1 аргумент для команды удаления всех контейнеров - PullRequest
0 голосов
/ 22 января 2019

Команда docker "docker container rm $(docker ps -aq) -f" отлично работает из командной строки.Однако, когда я пытаюсь запустить его из make-файла, используя следующую цель ("remove_all_containers") ...

remove_all_containers:
       docker container rm $(docker ps -aq) -f

, я получаю сообщение об ошибке:

host_name$ make remove_all_containers
docker container rm  -f
"docker container rm" requires at least 1 argument.
See 'docker container rm --help'.

Usage:  docker container rm [OPTIONS] CONTAINER [CONTAINER...]

Remove one or more containers
make: *** [remove_all_containers] Error 1

Яснопри выполнении из make-файла команда "docker ps" не выполняется должным образом, поэтому ее результаты могут быть собраны и переданы в команду "container rm".

Мой вопрос: Как заставить команду "docker ps" правильно запускаться из make-файла и правильно передавать ее результаты в команду "docker rm", также в makefile ?

Заранее благодарим за любую помощь, которую вы можете предложить.

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Звучит так, будто в докере нет контейнеров для удаления.Иногда я использую другой синтаксис для этого сценария:

remove_all_containers:
       docker container ls -aq | xargs --no-run-if-empty docker container rm -f

Синтаксис xargs не будет запускаться docker container rm, если нет контейнеров для удаления.

0 голосов
/ 22 января 2019

Вам нужен второй $ в вашем рецепте:

remove_all_containers:
       docker container rm $$(docker ps -aq) -f
#                           ^

Одиночный $ раскрывается как переменная make-файла при разборе make-файла. Расширяется до пустых. Сделайте поэтому пропускает docker container rm -f к вашей оболочке. Второй знак $ заставляет make расширяться $$ до $, и он передает docker container rm $(docker ps -aq) -f в bash, что, я полагаю, то, что вы хотите.

Обратите внимание, что если вы поместите туда shell, как предложено @EricMd, он будет запускать команду оболочки, но эта команда будет выполняться во время чтения Makefile, а не во время выполнения рецепта. Если команда docker ps -aq зависит от любых других артефактов вашей сборки, она не будет работать.

0 голосов
/ 22 января 2019

Согласно документации , docker ps -a должен перечислять все контейнеры.

Вы получили это сообщение "docker container rm" requires at least 1 argument, конечно, потому что вы забыли добавить пред ставленную команду с помощью встроенного в shell Make:

remove_all_containers:
       docker container rm $(shell docker ps -aq) -f

Также обратите внимание, что docker ps допускает функцию фильтрации: онлайн-документ описывает различные варианты соответствующего -f flag .

Например, ниже приведены три примера псевдонимов Bash, которые могут быть полезны для ( i ) остановки всех контейнеров, ( ii ) удаления всех остановленных контейнеров; и ( iii ) удалить оборванные изображения, которые будут помечены как <none> при выполнении docker images ls:

alias docker-stop='docker stop $(docker ps -a -q)'
alias docker-clean='docker rm $(docker ps -a -q -f status=exited)'
alias docker-purge='docker rmi $(docker images -q -f dangling=true)'
...