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