如何更正 makefile 中的 docker,它至少需要 1 个参数才能删除所有容器命令

How to correct docker in makefile which requires at least 1 argument for remove all containers command

docker 命令“docker container rm $(docker ps -aq) -f”在命令行中运行良好。但是,当我尝试使用以下目标 ("remove_all_containers")...

从 makefile 中 运行 它时
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

很明显,当从 makefile 中执行时,“docker ps”命令没有以可以收集其结果并将其传递到“container rm”的方式正确执行命令。

我的问题:如何从 makefile 中正确地获取 运行 的“docker ps”命令并将其结果正确传递到“ docker rm" 命令,也在 makefile?

提前感谢您提供的任何帮助。

根据 documentationdocker ps -a 应该列出所有容器。

您收到此消息 "docker container rm" requires at least 1 argument 肯定是因为您忘记了使用 Make 的 shell 内置命令来预先添加关键命令:

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

另请注意 docker ps 具有过滤功能:在线文档描述了相应 -f flag.

的各种风格

例如,下面是三个 Bash 别名示例,可用于 (i) 停止所有容器,(ii) 删除所有停止的容器;和 (iii) 删除悬空图像-在执行 docker images ls:

时将被标记为 <none>
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)'

听起来您在 docker 中没有任何容器可以移除。对于这种情况,我有时会使用不同的语法:

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

如果没有要删除的容器,xargs 语法将不会 运行 docker container rm

您的食谱中需要第二个 $

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

解析makefile时,单个$被扩展为makefile变量。它扩展为空白。因此 Make 将 docker container rm -f 传递给您的 shell。第二个 $ 符号导致 make 将 $$ 扩展为 $,并将 docker container rm $(docker ps -aq) -f 传递给 bash,我猜这就是您想要的。

注意,如果按照@EricMd 的建议将 shell 放在那里,它将 运行 一个 shell 命令,但该命令在 Makefile 中将是 运行读取时间,而不是执行配方的时间。如果 docker ps -aq 命令依赖于您构建的任何其他工件,它将不起作用。

我按照以下答案测试了 2 种方式:

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


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