我正在尝试使用rspec、serverspec和docker宝石来测试Dockerfile。在大多数情况下,我的测试都是通过的,但是所有使用command
方法的测试都失败了,并且返回空字符串,而不管我提供的命令是什么。
代码可以在GitHub上找到,但最突出的文件如下:
我的Dockerfile:
# Dockerfile for nginx with configurable persistent volumes
# Select nginx as the base image
FROM nginx
# Mount configurable persistent volumes
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]
# Expose both HTTP and HTTPS ports
EXPOSE 80 443
# ENTRYPOINT
ENTRYPOINT ["service", "nginx", "start"]
Gemfile:
source 'https://rubygems.org'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
group :development, :test do
gem 'specinfra', '~> 2.12.7'
gem 'serverspec', '~> 2.8.2'
gem 'docker-api', '~> 1.21.4'
gem 'rspec', '~> 3.2.0'
end
规格:
require 'serverspec'
require 'docker'
Excon.defaults[:ssl_verify_peer] = false
describe 'Dockerfile' do
before(:all) do
image = Docker::Image.build_from_dir('.')
set :os, family: :debian
set :backend, :docker
set :docker_image, image.id
end
it 'installs the right version of Debian' do
expect(os_version).to include('Debian GNU/Linux 7')
end
describe package('nginx') do
it { should be_installed }
end
describe service('nginx') do
it { should be_enabled }
it { should be_running }
end
describe command('nginx -V') do
its(:stdout) { should include('http_ssl_module') }
its(:stdout) { should include('http_gzip_static_module') }
end
describe port(80) do
it { should be_listening }
end
describe port(443) do
it { should be_listening }
end
def os_version
command('lsb_release -a').stdout
end
end
我知道我使用的是旧版本的宝石,但我无法使这与最新版本的工作。如果它有任何相关性,我在OS上,因此使用boot2docker。我在运行规范时得到的结果是:
Failures:
1) Dockerfile installs the right version of Debian
Failure/Error: expect(os_version).to include('Debian GNU/Linux 7')
expected "" to include "Debian GNU/Linux 7"
# ./spec/dockerfile_spec.rb:16:in `block (2 levels) in <top (required)>'
2) Dockerfile Command "nginx -V" stdout should include "http_ssl_module"
Failure/Error: its(:stdout) { should include('http_ssl_module') }
expected "" to include "http_ssl_module"
# ./spec/dockerfile_spec.rb:29:in `block (3 levels) in <top (required)>'
3) Dockerfile Command "nginx -V" stdout should include "http_gzip_static_module"
Failure/Error: its(:stdout) { should include('http_gzip_static_module') }
expected "" to include "http_gzip_static_module"
# ./spec/dockerfile_spec.rb:30:in `block (3 levels) in <top (required)>'
发布于 2015-08-25 06:38:11
当处理stderr和stdout时,我发现了一些类似的东西,当上游的specinfra、2.37.0和2.37.1被改变时。尝试使用重定向手动运行命令,以查看输出来自何处:
nginx -V 2>/dev/null
如果最后没有输出,那么它就会流到stderr中。一个解决办法是在结束时使用2>&1将所有内容放到标准输出中。
**回应意见的最新情况
~$ nginx -V
nginx version: nginx/1.4.4
built by gcc 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
TLS SNI support enabled
<snip>
~$ nginx -V 2>/dev/null
~$
https://stackoverflow.com/questions/32059421
复制相似问题