如何更正makefile中需要至少1个参数才能删除所有容器命令的码头工人

时间:2019-01-21 23:10:35

标签: docker makefile containers rm

泊坞窗命令“ 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 中?

在此先感谢您提供的任何帮助。

3 个答案:

答案 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)

根据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 )删除悬空的图像-在执行<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)'