【问题标题】:How to include docker cookbook in chef?如何在厨师中包含 docker 食谱?
【发布时间】:2016-09-21 02:52:06
【问题描述】:

我正在尝试使用此链接提供的食谱定义一个厨师食谱来安装 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

我做错了什么?

谢谢, 米歇尔。

【问题讨论】:

    标签: chef-infra berkshelf


    【解决方案1】:

    正如@coderanger 和@NilsLandt 所述,您需要编写自己的cookbook 来安装docker,并调用dockercookbook 提供的资源。

    示例

    “厨师生成食谱”命令生成的示例食谱

    ├── Berksfile
    ├── chefignore
    ├── metadata.rb
    ├── README.md
    ├── recipes
    │   └── default.rb
    └── test
        └── integration
            ├── default
            │   └── serverspec
            │       └── default_spec.rb
            └── helpers
                └── serverspec
                    └── spec_helper.rb
    

    元数据.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'
    

    食谱/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
    

    【讨论】:

    • 谢谢,这真的很有用,尤其是测试部分。
    【解决方案2】:

    docker 食谱没有提供任何食谱,这就是你的include_recipe 调用失败的原因。

    相反,您只需使用资源,就像使用 docker_service 资源一样。

    当您删除您的三个 include_recipe 行时,您的配方应该会运行。

    【讨论】:

    • 谢谢。我没看懂。删除它工作的线条后。
    【解决方案3】:

    docker_service 是资源,而不是配方。有关一些示例用法,请参阅自述文件,但总体思路是您需要编写自己的包装说明书,该说明书使用提供的自定义资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多