从RSpec脚本中删除Docker镜像

时间:2017-06-15 17:45:13

标签: ruby rspec serverspec

TL; DR:我无法从RSpec脚本中删除我的Docker镜像,因为RSpec仍然有一个依赖容器

我正在使用RSpec来测试我的Dockerfiles。也就是说,测试Dockerfile是否会产生正确的图像。我的测试脚本通过从Dockerfile构建映像,然后让RSpec测试容器(基于该映像)是否具有正确的内容来完成此操作。

执行流程如下:

  1. 我的RSpec脚本构建了Docker镜像(在before(:all)块中)
  2. Serverspec创建一个Docker容器(基于Docker镜像)
  3. RSpec / Serverspec执行Docker容器内的测试
  4. RSpec / Serverspec调用我的RSpec脚本的after(:all)
  5. RSpec / Serverspec删除Docker容器
  6. 我尝试从after(:all)块(或after(:context)块内部删除图像,但这有相同的问题),因为那是RSpec为我提供的最后一个钩子。只有我不能,因为尚未删除Docker容器。

    强制删除不是解决方案,因为Docker会保留一个未命名的,未标记的图像版本。

    是否有(惯用)方法来实现这一目标?

    示例RSpec脚本:

    require "serverspec"
    require "docker-api"
    
    describe "Dockerfile" do
    
      image_name = 'my_image'
      image_tag = 'my_tag'
      image_name_tag = image_name + ':' + image_tag
    
      before(:all) do
        set :os, family: :debian
        set :backend, :docker
    
        # Build image
        @image = Docker::Image.build_from_dir("../dockerfile/")
        @image.tag(repo: image_name, tag: image_tag)
    
        # Provide Serverspec with our image's id
        set :docker_image, @image.id
      end
    
      it "is a Debian-based container" do
        expect(os_version).to include("Debian")
      end
    
      def os_version
        command("cat /etc/*release").stdout
      end
    
      after(:context) do
         # Clean up
         @image.delete(name: image_name_tag) # <-- this fails
      end
    end
    

    (我不完全清楚RSpec的职责结束和Serverspec的开始;因此上面的 RSpec / Serverspec 。)

0 个答案:

没有答案