泊坞窗命令“ 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 中?
在此先感谢您提供的任何帮助。
答案 0 :(得分:3)
您需要在食谱中添加第二个$
:
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
命令依赖于构建中的任何其他工件,则它将不起作用。
答案 1 :(得分:1)
听起来像您在docker中没有要删除的任何容器。在这种情况下,有时我会使用其他语法:
['The cat jumped over', 'the moon very quickly.']
如果没有要删除的容器,则xargs语法将不会运行remove_all_containers:
docker container ls -aq | xargs --no-run-if-empty docker container rm -f
。
答案 2 :(得分:0)
根据documentation,docker 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 )删除悬空的图像-在执行<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)'