TL;DR:我无法从我的 RSpec 脚本中删除我的 Docker 映像,因为 RSpec 仍然有一个依赖容器
我正在使用 RSpec 来测试我的 Dockerfile。即测试 Dockerfile 生成的镜像是否正确。我的测试脚本通过从 Dockerfile 构建一个映像来完成此操作,然后让 RSpec 测试容器(基于该映像)是否具有正确的内容。
执行流程如下:
- 我的 RSpec 脚本构建 Docker 映像(在其
before(:all)
块中) - Serverspec 创建一个 Docker 容器(基于 Docker 镜像)
- RSpec / Serverspec 在 Docker 容器内执行测试
- RSpec / Serverspec 调用我的 RSpec 脚本
after(:all)
块 - 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 。)