我是Makefile的新手,我试图用它来帮助我自动构建docker映像。
我正在努力写一个简单的食谱,该食谱可以执行以下操作:
docker ps -a -q
)docker rm $(docker ps -a -q)
)到目前为止,我已经设法通过各种Google搜索来凑整这些东西:
DOCKER_CONTAINER_LIST := $(shell docker ps -a -q)
clean-docker:
if [[ ! $(DOCKER_CONTAINER_LIST) == "" ]];then \
docker rm $$(docker ps -a -q) \
fi
将产生以下输出:
如果[[de6e694da4f9 ==“”]];然后\
/ bin / sh:-c:第0行:需要条件二进制运算符
/ bin / sh:-c:第0行:'de6e694da4f9'附近的语法错误
/ bin / sh:-c:第0行:'if [[de6e694da4f9 ==“”]];然后\'
make:*** [clean-docker]错误2
如果有人可以告诉我如何实现这一目标,那将是很好的
更新
感谢@ I0b0的回答,我想我已经快到了。 Makefile
现在看起来像这样:
DOCKER_CONTAINER_LIST := $(shell docker ps -a -q)
clean-docker:
if [ -n "$(DOCKER_CONTAINER_LIST)" ] \
then \
docker rm "$(DOCKER_CONTAINER_LIST)" \
fi
但是运行它时出现以下错误:
如果[-n“ 6778d35e5c95”] \
然后\
docker rm“ 6778d35e5c95” \
fi
/ usr / bin / sh:-c:第4行:语法错误:文件意外结束
make:*** [clean-docker]错误1
我查看了this answer关于行尾的信息,但这没什么区别。我在Mac和Windows上都使用Makefile
。
答案 0 :(得分:0)
if [ -n "$(DOCKER_CONTAINER_LIST)" ]
应该这样做:
-n
是非空字符串的标准测试[[
is a bashism,但sh
is not bash
使用docker rm "$(DOCKER_CONTAINER_LIST)"
重用变量的奖励点。
更新后,问题与脚本和Makefile之间的根本区别有关:后者不能通过与脚本完全相同的方式分成几行,而只能在行尾添加反斜杠。您最终得到的是一行if [ -n "$(DOCKER_CONTAINER_LIST)" ] then docker rm "$(DOCKER_CONTAINER_LIST)" fi
。由于makefile中的换行符在shell脚本中不能像;
一样工作,因此必须添加两个:
if [ -n "$(DOCKER_CONTAINER_LIST)" ]; \
then \
docker rm "$(DOCKER_CONTAINER_LIST)"; \
fi
答案 1 :(得分:0)
可以通过以下方式完成:
# for images
docker rmi $(shell docker images -a -q)
# for containers
docker rm $(shell docker ps -a -q)
# for volumes
docker volume rm $(shell docker volume ls -q)
PS。 macOS
答案 2 :(得分:0)
我也不知道如何将这些命令分成多行,但是丑陋的oneliners对我有用。
所以你要问的就是这样
DOCKER_CONTAINER_LIST := $(shell docker ps -a -q)
clean_docker:
@if [ -n "$(DOCKER_CONTAINER_LIST)" ]; then echo "Removing docker containers" && docker rm "$(DOCKER_CONTAINER_LIST)"; else echo "No containers found"; fi;