serverspec使用错误的容器

问题描述 投票:1回答:1

我有2个spec文件使用不同的docker镜像,因此假设启动单独的和不同的docker容器来运行示例。

在下面的片段中,我使用serverspec gem来测试我的容器

spec/dockerfile/ember_spec.rb

require 'spec_helper'
require 'shared_examples/release'

describe 'ember' do
  before(:all) do
    @image = Docker::Image.build_from_dir(image_path('ember'))

    set :os, family: :alpine
    set :backend, :docker
    set :docker_image, @image.id
    set :docker_container_create_options, { 'Entrypoint' => ['/bin/sh'] }
  end

  describe command('ember version') do
    its(:stdout) { should contain 'ember-cli: 3.3.0' }
    its(:stdout) { should contain 'node: 10.10.0' }
  end

  include_examples 'os release', 'Alpine Linux'
end

spec/dockerfile/gerbv_spec.rb

require 'spec_helper'
require 'shared_examples/release'

describe 'gerbv' do
  before(:all) do
    @image = Docker::Image.build_from_dir(image_path('gerbv'))

    set :os, family: :debian
    set :backend, :docker
    set :docker_image, @image.id
    set :docker_container_create_options, { 'Entrypoint' => ['/bin/sh'] }
  end

  describe package('gerbv') do
    it { should be_installed }
  end

  include_examples 'os release', 'Ubuntu 18.04'
end

但是,当运行bundle exec rspec时,很明显使用相同的容器来运行每个spec文件。我已经通过在每个示例之前打印出正在运行的容器来确认这一点。这当然导致其中一个文件的规格失败(以第二个为准)。

当使用bundle exec rspec path/to/file独立运行文件时,所有规范都会通过。

在一个文件中的示例运行并为另一组示例创建新容器之后,有没有办法强制将容器缩小?

ruby docker rspec serverspec
1个回答
1
投票

我找到了一种方法来解决这个问题,尽管这个问题非常糟糕。这个问题的关键在于容器最终是如何released。当不再有任何引用指向Docker实例时,它将被垃圾收集并且容器被杀死并被删除。但是,对象实例在类级别变量中保存为base class中的单例。在我看来,“重置”specinfra的唯一方法是调用clear类继承的Docker方法。

最后,以下解决了问题,正在使用正确的类来运行每个规范。

after(:all) {
  Specinfra.backend.class.clear
}

很高兴知道有更好的方法来访问这些方法,而不必依赖于没有通过serverspec gem暴露的方法。

© www.soinside.com 2019 - 2024. All rights reserved.