如何在 Chef 中包含 docker 食谱?
How to include docker cookbook in chef?
我正在尝试使用此 link 提供的食谱定义要安装 docker 的厨师食谱:https://supermarket.chef.io/cookbooks/docker#readme
我正在使用 Berkshelf,所以我将这一行放在 Berkfile 中
cookbook 'docker', '~> 2.9.6'
这在 metadata.db
depends "docker"
我的食谱如下
include_recipe 'docker::docker_service'
include_recipe 'docker::docker_image'
include_recipe 'docker::docker_container'
docker_service 'default' do
action [:create, :start]
end
但是当我尝试 运行 厨房时,出现以下错误:
ERROR: could not find recipe docker_service for cookbook docker
但如果我查看我的 berkshelf 存储库,那里有食谱:
$ ls ~/.berkshelf/cookbooks/docker-2.9.6/libraries/ | grep docker_service.rb
docker_service.rb
我做错了什么?
谢谢,
米歇尔
docker 食谱未提供任何食谱,这就是您的 include_recipe
调用失败的原因。
相反,您只需使用这些资源,就像您已经拥有的 docker_service
资源一样。
当您删除三行 include_recipe
行时,您的食谱应该 运行。
docker_service
是资源,不是食谱。有关一些示例用法,请参阅自述文件,但总体思路是您需要使用提供的自定义资源编写自己的包装器说明书。
如@coderanger 和@NilsLandt 所述,您需要编写自己的说明书来安装 docker 并调用 docker 说明书提供的资源。
例子
"chef generate cookbook" 命令生成的示例食谱
├── Berksfile
├── chefignore
├── metadata.rb
├── README.md
├── recipes
│ └── default.rb
└── test
└── integration
├── default
│ └── serverspec
│ └── default_spec.rb
└── helpers
└── serverspec
└── spec_helper.rb
metadata.rb
添加 "apt" 和 "docker" 食谱作为依赖项
name 'docker_demo'
maintainer 'Mark O''Connor'
maintainer_email 'you@example.com'
license 'all_rights'
description 'Installs/Configures docker_demo'
long_description 'Installs/Configures docker_demo'
version '0.1.0'
depends 'apt'
depends 'docker'
recipes/default.rb
只需使用 "docker_service" 资源创建 docker 服务。 "create" 操作将安装 Docker.
#
# Cookbook Name:: docker_demo
# Recipe:: default
#
# Copyright (c) 2016 The Authors, All Rights Reserved.
include_recipe 'apt'
docker_service 'default' do
action [:create, :start]
end
test/integration/default/serverspec/default_spec.rb
一组测试来验证 docker
的安装
require 'spec_helper'
describe file('/usr/bin/docker') do
it { should be_file }
it { should be_executable }
end
describe command('/usr/bin/docker version') do
its(:stdout) { should match /Version: 1.12.1/ }
end
我正在尝试使用此 link 提供的食谱定义要安装 docker 的厨师食谱:https://supermarket.chef.io/cookbooks/docker#readme
我正在使用 Berkshelf,所以我将这一行放在 Berkfile 中
cookbook 'docker', '~> 2.9.6'
这在 metadata.db
depends "docker"
我的食谱如下
include_recipe 'docker::docker_service'
include_recipe 'docker::docker_image'
include_recipe 'docker::docker_container'
docker_service 'default' do
action [:create, :start]
end
但是当我尝试 运行 厨房时,出现以下错误:
ERROR: could not find recipe docker_service for cookbook docker
但如果我查看我的 berkshelf 存储库,那里有食谱:
$ ls ~/.berkshelf/cookbooks/docker-2.9.6/libraries/ | grep docker_service.rb
docker_service.rb
我做错了什么?
谢谢, 米歇尔
docker 食谱未提供任何食谱,这就是您的 include_recipe
调用失败的原因。
相反,您只需使用这些资源,就像您已经拥有的 docker_service
资源一样。
当您删除三行 include_recipe
行时,您的食谱应该 运行。
docker_service
是资源,不是食谱。有关一些示例用法,请参阅自述文件,但总体思路是您需要使用提供的自定义资源编写自己的包装器说明书。
如@coderanger 和@NilsLandt 所述,您需要编写自己的说明书来安装 docker 并调用 docker 说明书提供的资源。
例子
"chef generate cookbook" 命令生成的示例食谱
├── Berksfile
├── chefignore
├── metadata.rb
├── README.md
├── recipes
│ └── default.rb
└── test
└── integration
├── default
│ └── serverspec
│ └── default_spec.rb
└── helpers
└── serverspec
└── spec_helper.rb
metadata.rb
添加 "apt" 和 "docker" 食谱作为依赖项
name 'docker_demo'
maintainer 'Mark O''Connor'
maintainer_email 'you@example.com'
license 'all_rights'
description 'Installs/Configures docker_demo'
long_description 'Installs/Configures docker_demo'
version '0.1.0'
depends 'apt'
depends 'docker'
recipes/default.rb
只需使用 "docker_service" 资源创建 docker 服务。 "create" 操作将安装 Docker.
#
# Cookbook Name:: docker_demo
# Recipe:: default
#
# Copyright (c) 2016 The Authors, All Rights Reserved.
include_recipe 'apt'
docker_service 'default' do
action [:create, :start]
end
test/integration/default/serverspec/default_spec.rb
一组测试来验证 docker
的安装require 'spec_helper'
describe file('/usr/bin/docker') do
it { should be_file }
it { should be_executable }
end
describe command('/usr/bin/docker version') do
its(:stdout) { should match /Version: 1.12.1/ }
end