2 # Cookbook Name:: docker-grid
5 # Copyright 2016-2017, whitestar
7 # Licensed under the Apache License, Version 2.0 (the "License");
8 # you may not use this file except in compliance with the License.
9 # You may obtain a copy of the License at
11 # http://www.apache.org/licenses/LICENSE-2.0
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS,
15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 # See the License for the specific language governing permissions and
17 # limitations under the License.
20 # https://dcos.io/docs/1.8/administration/installing/custom/system-requirements/
22 install_flavor = node['docker-grid']['install_flavor']
23 platform = node['platform']
24 platform_family = node['platform_family']
25 platform_version = node['platform_version']
27 if node['docker-grid']['engine']['skip_setup']
28 log 'Skip the Docker Engine setup.'
32 ::Chef::Recipe.send(:include, PlatformUtils::Helper)
33 ::Chef::Recipe.send(:include, PlatformUtils::VirtUtils)
35 docker_ver = node['docker-grid']['engine']['version']
36 docker_ver = '' if docker_ver.nil?
41 resources(package: pkg) rescue package pkg do
46 bash 'systemctl_daemon-reload' do
48 systemctl daemon-reload
53 # https://docs.docker.com/engine/userguide/storagedriver/selectadriver/
54 if shell_out("cat /etc/mtab | grep -E '\s+/\s+zfs\s+'").exitstatus.zero?
55 if container_guest_node?
56 Chef::Log.warn('This node is running in the Linux container with ZFS, set the storage-driver to vfs as a fallback.')
57 node.override['docker-grid']['engine']['storage-driver'] = 'vfs'
59 Chef::Log.warn('This node is running on ZFS, set the storage-driver to zfs.')
60 node.override['docker-grid']['engine']['storage-driver'] = 'zfs'
64 storage_driver = node['docker-grid']['engine']['storage-driver']
66 if storage_driver == 'overlay2'
67 if !docker_ver.empty? && Gem::Version.create(docker_ver.tr('~', '-')) < Gem::Version.create('1.12')
68 # tr('~', '-') for Ubuntu.
69 Chef::Application.fatal!('Docker version must be 1.12 or later for overlay2 storage driver.') # and exit.
72 load_kernel_module('overlay') if storage_driver =~ /overlay2?/
74 userns_remap = node['docker-grid']['engine']['userns-remap']
75 if !userns_remap.nil? && !userns_remap.empty?
76 if !docker_ver.empty? && Gem::Version.create(docker_ver.tr('~', '-')) < Gem::Version.create('1.10')
77 # tr('~', '-') for Ubuntu.
78 Chef::Application.fatal!('Docker version must be 1.10 or later for userns-remap.') # and exit.
81 include_recipe 'platform_utils::kernel_user_namespace'
83 remap_user = userns_remap == 'default' ? 'dockremap' : userns_remap
86 'resource' => 'service[docker]',
89 ::Chef::Recipe.send(:include, PlatformUtils::Helper)
90 append_subusers([remap_user], notifies_conf)
93 bash 'clean_up_docker0_bridge' do
95 if brctl show | grep docker0; then
96 ip link set docker0 down
99 # https://github.com/docker/docker/issues/23630
100 if [ -d /var/lib/docker/network ]; then
101 rm -rf /var/lib/docker/network
109 if install_flavor == 'dockerproject'
110 # https://dcos.io/docs/1.8/administration/installing/custom/system-requirements/install-docker-centos/
111 template '/etc/yum.repos.d/docker.repo' do
112 source 'etc/yum.repos.d/docker.repo'
123 resources(package: pkg) rescue package pkg do
125 notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
130 'docker-engine-selinux',
133 resources(yum_package: pkg) rescue yum_package pkg do
136 version docker_ver unless docker_ver.empty?
137 # dockerrepo is disabled by default to prevent automatic update.
138 options '--enablerepo=dockerrepo'
139 notifies :run, 'bash[clean_up_docker0_bridge]', :before if pkg == 'docker-engine'
145 'docker-engine-selinux',
148 resources(package: pkg) rescue package pkg do
150 notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
154 file '/etc/systemd/system/docker.service.d/override.conf' do
161 resources(yum_package: pkg) rescue yum_package pkg do
164 version docker_ver unless docker_ver.empty?
165 notifies :run, 'bash[clean_up_docker0_bridge]', :before
169 template '/etc/sysconfig/docker' do
170 source 'etc/sysconfig/docker'
174 notifies :restart, 'service[docker]'
178 # https://docs.docker.com/engine/installation/linux/debian/
179 # https://docs.docker.com/engine/installation/linux/ubuntulinux/
181 'apt-transport-https',
185 'software-properties-common',
188 if storage_driver == 'aufs' \
189 && !container_guest_node?
190 if platform == 'debian'
194 elsif platform == 'ubuntu'
196 "linux-image-extra-#{node['os_version']}",
197 'linux-image-extra-virtual',
203 resources(package: pkg) rescue package pkg do
208 apt_get_update = 'apt-get_update'
209 resources(execute: apt_get_update) rescue execute apt_get_update do
210 command 'apt-get update'
214 if install_flavor == 'dockerproject'
215 pkg_name_removed = 'docker.io'
216 pkg_name = node['docker-grid']['dockerproject']['package_name']
218 apt_repo_config = node['docker-grid']['apt_repo']
219 bash 'apt-key_adv_docker_tools_key' do
221 apt-key adv --keyserver #{apt_repo_config['keyserver']} --recv-keys #{apt_repo_config['recv-keys']}
225 not_if 'apt-key list | grep -i docker'
228 template '/etc/apt/sources.list.d/docker.list' do
229 source 'etc/apt/sources.list.d/docker.list'
233 notifies :run, 'bash[apt-key_adv_docker_tools_key]', :before
234 notifies :run, "execute[#{apt_get_update}]", :immediately
238 pkg_name_removed = node['docker-grid']['dockerproject']['package_name']
239 pkg_name = 'docker.io'
242 # Pinning Docker version
243 template '/etc/apt/preferences.d/docker.pref' do
244 source 'etc/apt/preferences.d/docker.pref'
248 action :delete if docker_ver.empty?
254 resources(package: pkg_name_removed) rescue package pkg_name_removed do
256 notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
259 resources(package: pkg_name) rescue package pkg_name do
261 options '--allow-downgrades' if platform == 'debian' || platform_version >= '16.04' # LTS (xenial)
262 options '--force-yes' if platform_version == '14.04' # LTS (trusty)
263 version docker_ver unless docker_ver.empty?
264 notifies :run, 'bash[clean_up_docker0_bridge]', :before
270 storage_driver = node['docker-grid']['engine']['storage-driver']
271 docker_opts.push("--storage-driver=#{storage_driver}") if !storage_driver.nil? && !storage_driver.empty?
273 userns_remap = node['docker-grid']['engine']['userns-remap']
274 docker_opts.push("--userns-remap=#{userns_remap}") if !userns_remap.nil? && !userns_remap.empty?
276 extra_options = node['docker-grid']['engine']['daemon_extra_options']
277 # for docker-engine package on RHEL: remove '-H fd://'
278 # https://github.com/docker/docker/issues/22847
279 if platform_family == 'rhel' || platform == 'debian' || (platform == 'ubuntu' && platform_version == '14.04')
280 # Note: docker_ver.empty? -> the latest version
281 if docker_ver.empty? \
282 || Gem::Version.create(docker_ver.tr('~', '-')) >= Gem::Version.create('1.12')
283 extra_options = extra_options.gsub(%r{-H\sfd://}, '') # for frozen string.
287 docker_opts.push(extra_options) if !extra_options.nil? && !extra_options.empty?
289 init_package = node['init_package']
290 if init_package == 'systemd'
291 directory '/etc/systemd/system/docker.service.d' do
298 template '/etc/systemd/system/docker.service.d/override.conf' do
299 source 'etc/systemd/system/docker.service.d/override.conf'
304 docker_opts: docker_opts
306 not_if { install_flavor == 'os-repository' && platform_family == 'rhel' }
307 notifies :run, 'bash[systemctl_daemon-reload]', :immediately
308 notifies :restart, 'service[docker]'
310 elsif init_package == 'init' # for Ubuntu 14.04,...
311 template '/etc/default/docker' do
312 source 'etc/default/docker'
317 docker_opts: docker_opts
319 notifies :restart, 'service[docker]'
324 provider Chef::Provider::Service::Upstart if platform == 'ubuntu' && platform_version < '15.04'
325 action [:start, :enable]
326 subscribes :restart, 'execute[update-ca-certificates]', :delayed
329 users = node['docker-grid']['engine']['users_allow']
331 members users unless users.empty?
338 'docker_images_cleanup',
339 'docker_volumes_cleanup',
341 template "/usr/local/bin/#{script}" do
342 source "usr/local/bin/#{script}"