# docker-grid CHANGELOG
+1.3.0
+-----
+- adds autopilot features.
+
1.2.1
-----
- adds docker-compose cleanup before installing it.
--- /dev/null
+GEM
+ remote: https://rubygems.org/
+ specs:
+ chef-api (0.8.0)
+ logify (~> 0.1)
+ mime-types
+ logify (0.2.0)
+ mime-types (3.2.2)
+ mime-types-data (~> 3.2015)
+ mime-types-data (3.2018.0812)
+ stove (6.0.0)
+ chef-api (~> 0.5)
+ logify (~> 0.2)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ stove
+
+BUNDLED WITH
+ 1.16.0
|`['docker-grid']['dind-compose']['data_dir']`|String|persistent data directory.|`"#{node['docker-grid']['dind-compose']['app_dir']}/data"`|
|`['docker-grid']['dind-compose']['config']`|Hash|`docker-compose.yml` configurations.|See `attributes/default.rb`|
|`['docker-grid']['engine']['skip_setup']`|Boolean||`false`|
+|`['docker-grid']['engine']['autopilot']`|Hash|docker-engin autopilot configurations.|See `attributes/default.rb`|
|`['docker-grid']['engine']['version_on_centos']`|String|Docker version for CentOS. `''` (empty) means the latest version.|`'17.12.1.ce-1'`|
|`['docker-grid']['engine']['version_on_debian']`|String|Docker version for Debian. `''` (empty) means the latest version.|`'17.12.1~ce-0'`|
|`['docker-grid']['engine']['version_on_ubuntu']`|String|Docker version for Ubuntu. `''` (empty) means the latest version.|`'17.12.1~ce-0'`|
|`['docker-grid']['engine']['users_allow']`|Array|Non-root users allowed to manage Docker daemon.|`[]`|
|`['docker-grid']['registry']['with_ssl_cert_cookbook']`|Boolean|If this attribute is true, `node['docker-grid']['registry']['docker-compose']['config']` are are overridden by the following `common_name` attributes.|`false`|
|`['docker-grid']['registry']['ssl_cert']['common_name']`|String|Registry server common name for TLS|`node['fqdn']`|
+|`['docker-grid']['registry']['server']['autopilot']`|Hash|Resigtry server autopilot configurations.|See `attributes/default.rb`|
|`['docker-grid']['registry']['server']['config']`|Hash|Registry server configurations.|See `attributes/default.rb`|
+|`['docker-grid']['registry']['docker-compose']['autopilot']`|Hash|Registry docker-compose autopilot configurations.|See `attributes/default.rb`|
|`['docker-grid']['registry']['docker-compose']['app_dir']`|String||`"#{node['docker-grid']['compose']['app_dir']}/registry"`|
|`['docker-grid']['registry']['docker-compose']['host_data_volume']`|String|Data directory path on the host filesystem or `nil` (unset).|`'/var/lib/docker-registry'`|
|`['docker-grid']['registry']['docker-compose']['config_format_version']`|String|`docker-compose.yml` format version. `'1'` or `'2'`|`'1'`|
require 'foodcritic'
require 'stove/rake_task'
+tpl_cookbook = '00cookbook'
+cookbook_name = File.basename(Dir.pwd)
+
+desc 'Initialize project'
+task :init do
+ next if cookbook_name == tpl_cookbook
+
+ [
+ '.foodcritic',
+ '.rubocop.yml',
+ 'Berksfile',
+ 'concourse.yml',
+ 'fly-vars.yml',
+ 'fly-vars.local.yml',
+ 'Gemfile',
+ 'Gemfile.lock',
+ 'version',
+ ].each {|conf|
+ sh "cp ../#{tpl_cookbook}/#{conf} ./" unless File.exist?(conf)
+ }
+
+ ruby [
+ %(-pne '$_.gsub!(/^cookbook-name: .*$/, "cookbook-name: #{cookbook_name}")'),
+ '-i fly-vars.local.yml',
+ ].join(' ')
+end
+
+desc 'Update project'
+task :update do
+ next if cookbook_name == tpl_cookbook
+
+ [
+ 'Rakefile',
+ 'concourse.yml',
+ 'fly-vars.yml',
+ 'Gemfile',
+ 'Gemfile.lock',
+ ].each {|conf|
+ sh "cp ../#{tpl_cookbook}/#{conf} ./"
+ }
+end
+
+desc 'fly set-pipeline'
+task :'set-pipeline' do
+ sh [
+ "fly -t $CC_TARGET sp -p #{cookbook_name}-cookbook -c concourse.yml",
+ '-l fly-vars.yml -l fly-vars.local.yml -l ~/sec/credentials-prod.yml',
+ ].join(' ')
+end
+desc 'rake set-pipeline alias'
+task sp: 'set-pipeline'
+
namespace :style do
desc 'Run Ruby style checks'
RuboCop::RakeTask.new(:ruby) do |t|
}
default['docker-grid']['engine']['skip_setup'] = false
+default['docker-grid']['engine']['autopilot'] = {
+ 'enabled' => false,
+ 'log_dir' => '/var/log',
+ 'containers_prune_period' => '5 */4 * * *',
+ 'images_prune_period' => '10 */4 * * *',
+ 'volumes_prune_period' => '15 */4 * * *',
+}
+
# dockerproject: 18.06.0.ce-3, 18.03.1.ce-1, 17.12.1.ce-1, 1.13.1-1
# os-repository: yum list docker
# http://mirror.centos.org/centos/7.3.1611/extras/x86_64/Packages/
'default' => '/var/lib/docker-registry',
}
)
+default['docker-grid']['registry']['server']['autopilot'] = {
+ 'enabled' => false,
+ 'log_dir' => '/var/log',
+ 'wait_time' => '120s',
+ 'docker-compose_opts' => '--no-ansi',
+}
default['docker-grid']['registry']['server']['config'] = {
'version' => '0.1',
'log' => {
},
},
}
+
+default['docker-grid']['registry']['docker-compose']['autopilot'] = {
+ 'enabled' => false,
+ 'log_dir' => '/var/log',
+ 'wait_time' => '180s',
+ 'docker-compose_opts' => '--no-ansi',
+}
default['docker-grid']['registry']['docker-compose']['app_dir'] = "#{node['docker-grid']['compose']['app_dir']}/registry"
# ./docker-compose.yml
default['docker-grid']['registry']['docker-compose']['config_format_version'] = '1'
---
-# $ fly -t $CC_TARGET sp -p docker-grid-cookbook -c concourse.yml -l fly-vars.yml -l ~/sec/credentials-prod.yml
resources:
- name: src-git
type: git
- -c
- |
cd ./src-git/cookbooks/((cookbook-name))
+ bundle config --local silence_root_warning 1
bundle install
rake
- name: publish-cookbook
echo '{"username":"((chef-username))","key":"/root/chef-client-key.pem"}' > /root/.stove
echo "$chef_client_key" > /root/chef-client-key.pem
cd ./src-git/cookbooks/((cookbook-name))
+ bundle config --local silence_root_warning 1
bundle install
rake publish
- put: src-git
--- /dev/null
+---
+cookbook-name: docker-grid
---
-cookbook-name: docker-grid
chefdk-version: 1.6.11
# Cookbook Name:: docker-grid
# Recipe:: engine
#
-# Copyright 2016-2017, whitestar
+# Copyright 2016-2018, whitestar
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
node.force_override['docker-grid']['dockerproject']['enable_new_repo'] = true
end
enable_new_repo = node['docker-grid']['dockerproject']['enable_new_repo']
-docker_ver = node['docker-grid']['engine']['version']
+
+engine_conf = node['docker-grid']['engine']
+docker_ver = engine_conf['version']
docker_ver = '' if docker_ver.nil? || docker_ver == 'latest'
-storage_driver = node['docker-grid']['engine']['storage-driver']
-userns_remap = node['docker-grid']['engine']['userns-remap']
+storage_driver = engine_conf['storage-driver']
+userns_remap = engine_conf['userns-remap']
-if node['docker-grid']['engine']['skip_setup']
+if engine_conf['skip_setup']
log 'Skip the Docker Engine setup.'
return
end
docker_opts.push("--storage-driver=#{storage_driver}") if !storage_driver.nil? && !storage_driver.empty?
docker_opts.push("--userns-remap=#{userns_remap}") if !userns_remap.nil? && !userns_remap.empty?
-extra_options = node['docker-grid']['engine']['daemon_extra_options']
+extra_options = engine_conf['daemon_extra_options']
# for docker-engine package on RHEL: remove '-H fd://'
# https://github.com/docker/docker/issues/22847
if platform_family == 'rhel' || platform == 'debian' || (platform == 'ubuntu' && platform_version == '14.04')
subscribes :restart, 'execute[update-ca-certificates]', :delayed
end
-users = node['docker-grid']['engine']['users_allow']
+users = engine_conf['users_allow']
group 'docker' do
members users unless users.empty?
action :create
action :create
end
}
+
+# autopilot
+srv = 'dockerd'
+template "/etc/cron.d/#{srv}-local" do
+ source "etc/cron.d/#{srv}-local"
+ owner 'root'
+ group 'root'
+ mode '0644'
+ action :delete unless engine_conf['autopilot']['enabled']
+end
mode '0644'
notifies :restart, "service[#{service_name}]"
end
+
+# autopilot
+srv = 'docker-reg-server'
+template "/etc/cron.d/#{srv}-local" do
+ source "etc/cron.d/#{srv}-local"
+ owner 'root'
+ group 'root'
+ mode '0644'
+ variables(
+ service_name: service_name
+ )
+ action :delete unless node['docker-grid']['registry']['server']['autopilot']['enabled']
+end
# Cookbook Name:: docker-grid
# Recipe:: registry
#
-# Copyright 2016-2017, whitestar
+# Copyright 2016-2018, whitestar
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
include_recipe 'docker-grid::compose'
-app_dir = node['docker-grid']['registry']['docker-compose']['app_dir']
+compose_conf = node['docker-grid']['registry']['docker-compose']
+app_dir = compose_conf['app_dir']
auth_dir = "#{app_dir}/auth"
etc_dir = "#{app_dir}/etc"
[
envs = {}
vols = []
-host_data_volume = node['docker-grid']['registry']['docker-compose']['host_data_volume']
+host_data_volume = compose_conf['host_data_volume']
unless host_data_volume.nil?
directory host_data_volume do
owner 'root'
vols.push("#{server_key_path(cn)}:/certs/domain.key:ro")
end
-unless node['docker-grid']['registry']['docker-compose']['registry-config'].nil?
+unless compose_conf['registry-config'].nil?
template "#{app_dir}/etc/config.yml" do
source 'opt/docker-compose/app/registry/etc/config.yml'
owner 'root'
vols.push('./etc/config.yml:/etc/docker/registry/config.yml:ro')
end
-service_name = node['docker-grid']['registry']['docker-compose']['service_name']
+service_name = compose_conf['service_name']
version_1_config = {
service_name => {
},
}
node.override['docker-grid']['registry']['docker-compose']['config'] = \
- node['docker-grid']['registry']['docker-compose']['config_format_version'] == '2' ? version_2_config : version_1_config
+ compose_conf['config_format_version'] == '2' ? version_2_config : version_1_config
[
'docker-compose.yml',
end
}
+# autopilot
+srv = 'docker-registry'
+template "/etc/cron.d/#{srv}-local" do
+ source "etc/cron.d/#{srv}-local"
+ owner 'root'
+ group 'root'
+ mode '0644'
+ action :delete unless compose_conf['autopilot']['enabled']
+end
+
log 'registry-docker-compose post install message' do
message <<-"EOM"
Note: You must execute the following command manually.
--- /dev/null
+<%
+name = 'docker-reg-server'
+
+conf = node['docker-grid']['registry']['server']['autopilot']
+log = "#{conf['log_dir']}/#{name}-local.log"
+wait_time = conf['wait_time']
+-%>
+PATH=/usr/bin:/bin:/usr/local/bin
+DATE_F='+%Y-%m-%d %H:%M:%S %z'
+LOG=<%= log %>
+NAME=<%= @service_name %>
+
+@reboot root sleep <%= wait_time %> && date "$DATE_F" > $LOG && systemctl restart $NAME >> $LOG 2>&1 && systemctl status $NAME >> $LOG 2>&1
--- /dev/null
+<%
+name = 'docker-registry'
+
+conf = node['docker-grid']['registry']['docker-compose']['autopilot']
+log = "#{conf['log_dir']}/#{name}-local.log"
+wait_time = conf['wait_time']
+
+opts = conf['docker-compose_opts']
+-%>
+PATH=/usr/bin:/bin:/usr/local/bin
+DATE_F='+%Y-%m-%d %H:%M:%S %z'
+LOG=<%= log %>
+APP_HOME=<%= node['docker-grid']['registry']['docker-compose']['app_dir'] %>
+OPTS='<%= opts %>'
+
+@reboot root sleep <%= wait_time %> && date "$DATE_F" > $LOG && cd $APP_HOME && docker-compose $OPTS down >> $LOG 2>&1 && docker-compose $OPTS up -d >> $LOG 2>&1 && docker-compose ps >> $LOG 2>&1
--- /dev/null
+<%
+name = 'dockerd'
+
+conf = node['docker-grid']['engine']['autopilot']
+log = "#{conf['log_dir']}/#{name}-local.log"
+-%>
+PATH=/usr/bin:/bin:/usr/local/bin
+LOG=<%= log %>
+
+<%= conf['containers_prune_period'] %> root docker_containers_cleanup >> $LOG 2>&1
+<%= conf['images_prune_period'] %> root docker_images_cleanup >> $LOG 2>&1
+<%= conf['volumes_prune_period'] %> root docker_volumes_cleanup >> $LOG 2>&1