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 platform = node['platform']
23 platform_version = node['platform_version']
25 if node['docker-grid']['engine']['skip_setup']
26 log 'Skip the Docker Engine setup.'
30 ::Chef::Recipe.send(:include, PlatformUtils::Helper)
31 ::Chef::Recipe.send(:include, PlatformUtils::VirtUtils)
33 docker_ver = node['docker-grid']['engine']['version']
34 docker_ver = '' if docker_ver.nil?
39 resources(package: pkg) rescue package pkg do
44 bash 'systemctl_daemon-reload' do
46 systemctl daemon-reload
51 # https://docs.docker.com/engine/userguide/storagedriver/selectadriver/
52 if shell_out("cat /etc/mtab | grep -E '\s+/\s+zfs\s+'").exitstatus == 0
53 if container_guest_node?
54 Chef::Log.warn('This node is running in the Linux container with ZFS, set the storage-driver to vfs as a fallback.')
55 node.override['docker-grid']['engine']['storage-driver'] = 'vfs'
57 Chef::Log.warn('This node is running on ZFS, set the storage-driver to zfs.')
58 node.override['docker-grid']['engine']['storage-driver'] = 'zfs'
62 storage_driver = node['docker-grid']['engine']['storage-driver']
64 if storage_driver == 'overlay2'
65 if !docker_ver.empty? && Gem::Version.create(docker_ver.tr('~', '-')) < Gem::Version.create('1.12')
66 # tr('~', '-') for Ubuntu.
67 Chef::Application.fatal!('Docker version must be 1.12 or later for overlay2 storage driver.') # and exit.
70 load_kernel_module('overlay') if storage_driver =~ /overlay2?/
72 userns_remap = node['docker-grid']['engine']['userns-remap']
73 if !userns_remap.nil? && !userns_remap.empty?
74 if !docker_ver.empty? && Gem::Version.create(docker_ver.tr('~', '-')) < Gem::Version.create('1.10')
75 # tr('~', '-') for Ubuntu.
76 Chef::Application.fatal!('Docker version must be 1.10 or later for userns-remap.') # and exit.
79 include_recipe 'platform_utils::kernel_user_namespace'
81 remap_user = userns_remap == 'default' ? 'dockremap' : userns_remap
84 'resource' => 'service[docker]',
87 ::Chef::Recipe.send(:include, PlatformUtils::Helper)
88 append_subusers([remap_user], notifies_conf)
91 bash 'clean_up_docker0_bridge' do
93 if brctl show | grep docker0; then
94 ip link set docker0 down
97 # https://github.com/docker/docker/issues/23630
98 if [ -d /var/lib/docker/network ]; then
99 rm -rf /var/lib/docker/network
105 case node['platform_family']
107 if node['docker-grid']['install_flavor'] == 'dockerproject'
108 # https://dcos.io/docs/1.8/administration/installing/custom/system-requirements/install-docker-centos/
109 template '/etc/yum.repos.d/docker.repo' do
110 source 'etc/yum.repos.d/docker.repo'
121 resources(package: pkg) rescue package pkg do
123 notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
128 'docker-engine-selinux',
131 resources(yum_package: pkg) rescue yum_package pkg do
134 version docker_ver unless docker_ver.empty?
135 # dockerrepo is disabled by default to prevent automatic update.
136 options '--enablerepo=dockerrepo'
137 notifies :run, 'bash[clean_up_docker0_bridge]', :before if pkg == 'docker-engine'
143 'docker-engine-selinux',
146 resources(package: pkg) rescue package pkg do
148 notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
152 file '/etc/systemd/system/docker.service.d/override.conf' do
159 resources(yum_package: pkg) rescue yum_package pkg do
162 version docker_ver unless docker_ver.empty?
163 notifies :run, 'bash[clean_up_docker0_bridge]', :before
167 template '/etc/sysconfig/docker' do
168 source 'etc/sysconfig/docker'
172 notifies :restart, 'service[docker]'
176 # https://docs.docker.com/engine/installation/linux/debian/
177 # https://docs.docker.com/engine/installation/linux/ubuntulinux/
179 'apt-transport-https',
183 'software-properties-common',
186 if storage_driver == 'aufs' \
187 && !container_guest_node?
188 if platform == 'debian'
192 elsif platform == 'ubuntu'
194 "linux-image-extra-#{node['os_version']}",
195 'linux-image-extra-virtual',
201 resources(package: pkg) rescue package pkg do
206 apt_get_update = 'apt-get_update'
207 resources(execute: apt_get_update) rescue execute apt_get_update do
208 command 'apt-get update'
212 if node['docker-grid']['install_flavor'] == 'dockerproject'
213 pkg_name_removed = 'docker.io'
214 pkg_name = node['docker-grid']['dockerproject']['package_name']
216 apt_repo_config = node['docker-grid']['apt_repo']
217 bash 'apt-key_adv_docker_tools_key' do
219 apt-key adv --keyserver #{apt_repo_config['keyserver']} --recv-keys #{apt_repo_config['recv-keys']}
223 not_if 'apt-key list | grep -i docker'
226 template '/etc/apt/sources.list.d/docker.list' do
227 source 'etc/apt/sources.list.d/docker.list'
231 notifies :run, 'bash[apt-key_adv_docker_tools_key]', :before
232 notifies :run, "execute[#{apt_get_update}]", :immediately
236 pkg_name_removed = node['docker-grid']['dockerproject']['package_name']
237 pkg_name = 'docker.io'
240 # Pinning Docker version
241 template '/etc/apt/preferences.d/docker.pref' do
242 source 'etc/apt/preferences.d/docker.pref'
246 action :delete if docker_ver.empty?
252 resources(package: pkg_name_removed) rescue package pkg_name_removed do
254 notifies :run, 'bash[clean_up_docker0_bridge]', :immediately
257 resources(package: pkg_name) rescue package pkg_name do
259 options '--allow-downgrades' if platform == 'debian' || platform_version >= '16.04' # LTS (xenial)
260 options '--force-yes' if platform_version == '14.04' # LTS (trusty)
261 version docker_ver unless docker_ver.empty?
262 notifies :run, 'bash[clean_up_docker0_bridge]', :before
268 storage_driver = node['docker-grid']['engine']['storage-driver']
269 docker_opts.push("--storage-driver=#{storage_driver}") if !storage_driver.nil? && !storage_driver.empty?
271 userns_remap = node['docker-grid']['engine']['userns-remap']
272 docker_opts.push("--userns-remap=#{userns_remap}") if !userns_remap.nil? && !userns_remap.empty?
274 extra_options = node['docker-grid']['engine']['daemon_extra_options']
275 # for docker-engine package on RHEL: remove '-H fd://'
276 # https://github.com/docker/docker/issues/22847
277 if (node['platform_family'] == 'rhel' || platform == 'debian' || platform_version == '14.04') \
278 && !docker_ver.empty? && Gem::Version.create(docker_ver.tr('~', '-')) >= Gem::Version.create('1.12')
279 extra_options.gsub!(%r{-H\sfd://}, '')
282 docker_opts.push(extra_options) if !extra_options.nil? && !extra_options.empty?
284 init_package = node['init_package']
285 if init_package == 'systemd'
286 directory '/etc/systemd/system/docker.service.d' do
293 template '/etc/systemd/system/docker.service.d/override.conf' do
294 source 'etc/systemd/system/docker.service.d/override.conf'
299 docker_opts: docker_opts
301 not_if { node['docker-grid']['install_flavor'] == 'os-repository' && node['platform_family'] == 'rhel' }
302 notifies :run, 'bash[systemctl_daemon-reload]', :immediately
303 notifies :restart, 'service[docker]'
305 elsif init_package == 'init' # for Ubuntu 14.04,...
306 template '/etc/default/docker' do
307 source 'etc/default/docker'
312 docker_opts: docker_opts
314 notifies :restart, 'service[docker]'
319 provider Chef::Provider::Service::Upstart if platform == 'ubuntu' && platform_version < '15.04'
320 action [:start, :enable]
321 subscribes :restart, 'execute[update-ca-certificates]', :delayed
324 users = node['docker-grid']['engine']['users_allow']
326 members users unless users.empty?
331 template '/usr/local/bin/docker_images_cleanup' do
332 source 'usr/local/bin/docker_images_cleanup'