如何更正 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?
中
提前感谢您提供的任何帮助。
根据 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) 删除悬空图像-在执行 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
docker 命令“docker container rm $(docker ps -aq) -f
”在命令行中运行良好。但是,当我尝试使用以下目标 ("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
很明显,当从 makefile 中执行时,“docker ps
”命令没有以可以收集其结果并将其传递到“container rm
”的方式正确执行命令。
我的问题:如何从 makefile 中正确地获取 运行 的“docker ps
”命令并将其结果正确传递到“ docker rm
" 命令,也在 makefile?
提前感谢您提供的任何帮助。
根据 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) 删除悬空图像-在执行 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