我有一个Makefile和一些基本的docker命令:
all: build
build:
docker build .
DOCKER_CONTAINERS=$(docker ps -a -q)
DOCKER_IMAGES=$(docker images -q)
clean:
ifdef $(DOCKER_CONTAINERS)
@echo "Stopping Docker containers..."
docker stop $(DOCKER_CONTAINERS)
@echo "Deleting Docker containers..."
docker rm $(DOCKER_CONTAINERS)
endif
iclean:
ifdef $(DOCKER_IMAGES)
@echo "Deleting Docker images..."
docker rmi $(DOCKER_IMAGES)
endif我想用最后一个来清理现有的图像,我确实有一些图像:
$ docker images -q
aaa5a74f6006
099dec0df83b
c9889c81a971
bddca31db222
d85328b9bf58
dd6f76d9cc90但是,在规则中似乎没有定义DOCKER_IMAGES (稍后我通过显示它来检查它):
$ make iclean
make: Nothing to be done for 'iclean'.它在clean中运行得很好。
$ make clean
Stopping Docker containers...
docker stop $(docker ps -a -q)
f33d30ddc991
35d4d9262460
9ac0507e0b7b
59ff62aa1c0a
2d623e844c23
cb013d3919f4
Deleting Docker containers...
docker rm $(docker ps -a -q)
f33d30ddc991
35d4d9262460
9ac0507e0b7b
59ff62aa1c0a
2d623e844c23
cb013d3919f4我在这里做错什么了?
发布于 2017-11-11 07:25:07
我看到两个潜在的问题:
$(docker images -q)调用make docker函数..。这并不存在。这将计算为空字符串,即使您有docker图像。使用:
DOCKER_IMAGES =$(外壳码头映像-q)ifdef不像您想象的那样工作:
ifdef $(DOCKER_IMAGES)
展开变量$(DOCKER_IMAGES),然后测试命名为展开结果的变量是否有值。不是你想要的。你可以用:
ifdef DOCKER_IMAGES
而不是。但这不是一个很好的主意,因为DOCKER_IMAGES的值可能只是空白。您需要的是测试$(DOCKER_IMAGES)是否为空字符串。使用:
ifneq ( $(DOCKER_IMAGES))
注意,$(strip...)很重要,它删除了前导和尾随空格,这样如果$(DOCKER_IMAGES)只包含空白,测试就不会通过。有关正在运行的容器的代码的相同注释。
https://stackoverflow.com/questions/47233626
复制相似问题