1

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


我正在使用 RSpec 来测试我的 Dockerfile。即测试 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 容器

我试图从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 。)

4

0 回答 0