仅在 vagrant 中发生的 chef 运行 中的 NoMethodError 错误

NoMethodError error in chef run that only occurs in vagrant

我有一本包含 docker 食谱(以及许多其他食谱)的食谱。当我尝试在 Vagrant 中使用这本食谱时,我得到了一个 NoMethodError for coerce_shell_command。这是日志的相关部分:

==> default: Compiling Cookbooks...
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/libraries/autoload.rb:19:in `<top (required)>'
==> default: /opt/chef/embedded/lib/ruby/2.1.0/forwardable.rb:183:in `setup_run_context'
==> default: /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/bin/chef-solo:25:in `<top (required)>'
==> default: /usr/bin/chef-solo:54:in `load'
==> default: /usr/bin/chef-solo:54:in `<main>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:39:in `<class:DockerBase>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:2:in `<module:DockerCookbook>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:1:in `<top (required)>'
==> default: /opt/chef/embedded/lib/ruby/2.1.0/forwardable.rb:183:in `setup_run_context'
==> default: /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/bin/chef-solo:25:in `<top (required)>'
==> default: /usr/bin/chef-solo:54:in `load'
==> default: /usr/bin/chef-solo:54:in `<main>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:44:in `<class:DockerBase>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:2:in `<module:DockerCookbook>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:1:in `<top (required)>'
==> default: /opt/chef/embedded/lib/ruby/2.1.0/forwardable.rb:183:in `setup_run_context'
==> default: /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/bin/chef-solo:25:in `<top (required)>'
==> default: /usr/bin/chef-solo:54:in `load'
==> default: /usr/bin/chef-solo:54:in `<main>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:49:in `<class:DockerBase>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:2:in `<module:DockerCookbook>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:1:in `<top (required)>'
==> default: /opt/chef/embedded/lib/ruby/2.1.0/forwardable.rb:183:in `setup_run_context'
==> default: /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/bin/chef-solo:25:in `<top (required)>'
==> default: /usr/bin/chef-solo:54:in `load'
==> default: /usr/bin/chef-solo:54:in `<main>'
==> default: 
==> default: ================================================================================
==> default: Recipe Compile Error in /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb
==> default: ================================================================================
==> default: 
==> default: NoMethodError
==> default: -------------
==> default: undefined method `coerce_shell_command' for DockerCookbook::DockerBase:Class
==> default: 
==> default: Cookbook Trace:
==> default: ---------------
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:56:in `block in <class:DockerBase>'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/property.rb:599:in `call'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/property.rb:599:in `exec_in_resource'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/property.rb:427:in `coerce'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/property.rb:91:in `initialize'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/property.rb:52:in `new'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/property.rb:52:in `derive'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/mixin/properties.rb:150:in `property_type'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:54:in `<class:DockerBase>'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:2:in `<module:DockerCookbook>'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:1:in `<top (required)>'
==> default: 
==> default: Relevant File Content:
==> default: ----------------------
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:
==> default: 
==> default:  49:      NonEmptyArray = property_type(
==> default:  50:        is: [Array, nil],
==> default:  51:        coerce: proc { |v| Array(v).empty? ? nil : Array(v) }
==> default:  52:      ) unless defined?(NonEmptyArray)
==> default:  53:  
==> default:  54:      ShellCommand = property_type(
==> default:  55:        is: [String],
==> default:  56>>       coerce: proc { |v| coerce_shell_command(v) }
==> default:  57:      ) unless defined?(ShellCommand)
==> default:  58:  
==> default:  59:      UnorderedArrayType = property_type(
==> default:  60:        is: [UnorderedArray, nil],
==> default:  61:        coerce: proc { |v| v.nil? ? nil : UnorderedArray.new(Array(v)) }
==> default:  62:      ) unless defined?(UnorderedArrayType)
==> default:  63:  
==> default:  64:      PartialHashType = property_type(
==> default:  65:        is: [PartialHash, nil],
==> default: 
==> default: 
==> default: Running handlers:
==> default: [2016-01-28T16:27:24-08:00] ERROR: Running exception handlers
==> default: Running handlers complete
==> default: [2016-01-28T16:27:24-08:00] ERROR: Exception handlers complete
==> default: Chef Client failed. 0 resources updated in 05 seconds
==> default: [2016-01-28T16:27:24-08:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
==> default: [2016-01-28T16:27:24-08:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report
==> default: [2016-01-28T16:27:24-08:00] ERROR: undefined method `coerce_shell_command' for DockerCookbook::DockerBase:Class
==> default: [2016-01-28T16:27:24-08:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)`

(完整的流浪者日志 here

我正在使用 vagrant-berkshelf 安装我的包装器食谱及其所有依赖项。我能够在预期的文件中找到该函数 docker/libraries/helpers_base.rb 但是,厨师似乎没有找到它。

我认为这不是食谱中的错误,因为它在 运行:

时有效

我尝试过的事情:

然而,每次 运行 vagrant up 时,我都会继续遇到同样的错误。

这是您使用的 compat_resource 版本中的错误:

==> default: Using compat_resource (12.5.26)

我认为它已在 12.7.0 中修复。当您再次尝试时,您提取了解决问题的新食谱。

看起来像这里的相关错误:

https://github.com/chef-cookbooks/docker/issues/621

(看起来它可能还没有修复,但它 'smells' compat_resource 相关,这是你应该关注的错误)