Makefile删除已停止的Docker容器

时间:2019-06-09 09:57:19

标签: makefile

我是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

3 个答案:

答案 0 :(得分:0)

if [ -n "$(DOCKER_CONTAINER_LIST)" ]应该这样做:

使用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;