如何在Makefile中更正docker,该文件至少需要1个参数才能删除所有容器命令

Inf*_*ogy 4 containers makefile rm docker

docker命令“ docker container rm $(docker ps -aq) -f”可以从命令行正常运行。但是,当我尝试使用以下目标(“ remove_all_containers”)从makefile运行它时...

remove_all_containers:
       docker container rm $(docker ps -aq) -f
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:

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
Run Code Online (Sandbox Code Playgroud)

显然,当从makefile中执行docker ps命令时,“ ”命令不能正确执行,因为它的结果可以被收集并传递到“ container rm”命令中。

我的问题:如何docker ps从makefile内正确运行命令,并将结果正确传递docker rmmakefile内的命令?

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

BMi*_*tch 12

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

remove_all_containers:
       docker container ls -aq | xargs --no-run-if-empty docker container rm -f
Run Code Online (Sandbox Code Playgroud)

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


Har*_*nry 5

您需要一秒钟$的食谱:

remove_all_containers:
       docker container rm $$(docker ps -aq) -f
#                           ^
Run Code Online (Sandbox Code Playgroud)

$解析makefile时,该单身将作为makefile变量展开。它扩展为空白。因此docker container rm -f,使传递到您的外壳。第二个$符号使make扩展$$$,它将传递docker container rm $(docker ps -aq) -f给bash,我猜这是您想要的。

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