如何在 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