From f9b1df22cb99f6ed04d594bdf97a7c42f6881fef Mon Sep 17 00:00:00 2001 From: Alessandro Franceschi Date: Sun, 27 Mar 2016 15:08:55 +0200 Subject: [PATCH 1/6] Preliminary tp::dockerize --- manifests/dockerize.pp | 133 +++++++++++++++++++++++++++++ templates/dockerize/Dockerfile.erb | 32 +++++++ templates/dockerize/init.erb | 13 +++ 3 files changed, 178 insertions(+) create mode 100644 manifests/dockerize.pp create mode 100644 templates/dockerize/Dockerfile.erb create mode 100644 templates/dockerize/init.erb diff --git a/manifests/dockerize.pp b/manifests/dockerize.pp new file mode 100644 index 0000000..624c139 --- /dev/null +++ b/manifests/dockerize.pp @@ -0,0 +1,133 @@ +# @define tp::dockerize +# +# This define dockerizes an application. +# It can: +# - Create a dockerfile based on tinydata (default: false) +#  - Build the relevant image (default:false) +#  - Push the image to Docker Hub (default:false) +#  - Run the image from the Docker Hub (default:true) +# +define tp::dockerize ( + + String[1] $ensure = 'present', + + Variant[Undef,String] $template = 'tp/dockerize/Dockerfile.erb', + Variant[Undef,String] $init_template = 'tp/dockerize/init.erb', + String[1] $workdir = '/var/tmp', + + String[1] $username = 'example42', + + String[1] $os = downcase($::operatingsystem), + String[1] $osversion = $::operatingsystemmajrelease, + + Variant[Undef,String] $maintainer = undef, + Variant[Undef,String] $from = undef, + + Variant[Undef,String] $repository = undef, + Variant[String] $repository_tag = 'latest', + + Boolean $run = true, + Boolean $create = false, + Boolean $build = false, + Boolean $push = false, + + String $build_options = '', + + Boolean $mount_data_dir = true, + Boolean $mount_log_dir = true, + + Hash $settings_hash = {}, + + String[1] $data_module = 'tinydata', + + ) { + + # Settings evaluation + $app = $title + $tp_settings = tp_lookup($app,'settings',$data_module,'merge') + $settings = $tp_settings + $settings_hash + + $real_repository = $repository ? { + undef => "${app}-${os}${osversion}", + default => $repository, + } + $real_from = $from ? { + undef => $os, + default => $from, + } + $real_path = "${workdir}/${os}/${osversion}/${app}/Dockerfile" + + # Dockerfile creation + if $create { + if ! defined(File[$workdir]) { + file { $workdir: + ensure => directory, + } + } + if ! defined(File["${workdir}/${os}"]) { + file { "${workdir}/${os}": + ensure => directory, + } + } + if ! defined(File["${workdir}/${os}/${osversion}"]) { + file { "${workdir}/${os}/${osversion}": + ensure => directory, + } + } + if ! defined(File["${workdir}/${os}/${osversion}/${app}"]) { + file { "${workdir}/${os}/${osversion}/${app}": + ensure => directory, + } + } + + file { "${workdir}/${os}/${osversion}/${app}/Dockerfile": + ensure => $ensure, + content => template($template), + } + } + + # Image build + if $build and $ensure == 'present' { + exec { "docker build ${build_options} -t ${username}/${real_repository}:${repository_tag} .": + cwd => "${workdir}/${os}/${osversion}/${app}", + path => '/bin:/usr/bin:/sbin:/usr/sbin', + subscribe => File["${workdir}/${os}/${osversion}/${app}/Dockerfile"], + refreshonly => true, + } + } + + # Image upload to Docker Hub + if $push and $ensure == 'present' { + exec { "docker push ${username}/${real_repository}:${repository_tag}": + cwd => "${workdir}/${os}/${osversion}/${app}", + path => '/bin:/usr/bin:/sbin:/usr/sbin', + subscribe => Exec["docker build ${build_options} -t ${username}/${real_repository}:${repository_tag} ."], + refreshonly => true, + } + } + + # Image run + if $run { + $service_ensure = $ensure ? { + 'absent' => 'stopped', + false => 'stopped', + default => $settings[service_ensure], + } + $service_enable = $ensure ? { + 'absent' => false, + false => false, + default => $settings[service_enable], + } + file { "/etc/init/docker-${app}": + ensure => $ensure, + content => template($init_template), + mode => '0755', + notify => Service["docker-${app}"], + } + service { "docker-${app}": + ensure => $service_ensure, + enable => $service_enable, + } + } + +} diff --git a/templates/dockerize/Dockerfile.erb b/templates/dockerize/Dockerfile.erb new file mode 100644 index 0000000..4f21a73 --- /dev/null +++ b/templates/dockerize/Dockerfile.erb @@ -0,0 +1,32 @@ +# Dockerfile generated by tp::dockerize { '<%= @app %>': } +FROM <%= @real_from %> +<% if @maintainer -%> +MAINTAINER <%= @maintainer %> +<% end -%> +<% if @os == 'debian' or @os == 'ubuntu' -%> +<% if @settings['repo_url'] -%> +RUN echo "deb <%= @settings['repo_url'] -%> <%= @settings['apt_repos'] %> <%= @settings['apt_release'] %>" > /etc/apt/sources.list.d/<%= @app %>.list +<% if @settings['apt_key_server'] -%> +RUN apt-key add --keyserver <%= @settings['apt_key_server'] %> --recv-key <%= @settings['key'] %> +<% end -%> +<% end -%> +RUN apt-get update && \ + apt-get install -y --no-install-recommends <%= @settings['package_name'] %> && \ + rm -rf /var/lib/apt/lists/* +<% end -%> +<% if @os == 'redhat' or @os == 'centos' -%> +<% if @settings['repo_url'] -%> +RUN echo "[<%= @app %>]\nname=<%= @app %> repository\nbaseurl=<%= @settings['repo_url'] -%> > /etc/yum.repos.d/<%= @app %>.repo +<% end -%> +RUN yum install -y <%= @settings['package_name'] %> && yum clean all +<% end -%> +<% if @settings['tcp_port'] -%> +EXPOSE <%= @settings['tcp_port'] %> +<% end -%> +<% if @settings['data_dir'] and @mount_data_dir -%> +VOLUME <%= @settings['data_dir'] %> +<% end -%> +<% if @settings['log_dir'] and @mount_log_dir -%> +VOLUME <%= @settings['log_dir'] %> +<% end -%> + diff --git a/templates/dockerize/init.erb b/templates/dockerize/init.erb new file mode 100644 index 0000000..eb7196e --- /dev/null +++ b/templates/dockerize/init.erb @@ -0,0 +1,13 @@ +# <%= @app %> Docker instance + +description "<%= @app %> Docker instance" + +start on runlevel [2345] +stop on runlevel [!2345] + +respawn +respawn limit 10 5 +umask 022 + +exec <%= @settings['process_name'] %> <% if @settings['process_args'] %><%= @settings['process_args'] %><% end %> + From f41750d0555f6d45a06902a15a3f8335965f0895 Mon Sep 17 00:00:00 2001 From: Alessandro Franceschi Date: Mon, 28 Mar 2016 23:56:09 +0200 Subject: [PATCH 2/6] Fixing tp::dockerize --- manifests/dockerize.pp | 22 ++++++++++++++-------- templates/dockerize/Dockerfile.erb | 13 ++++++++----- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/manifests/dockerize.pp b/manifests/dockerize.pp index 624c139..7f28207 100644 --- a/manifests/dockerize.pp +++ b/manifests/dockerize.pp @@ -24,7 +24,7 @@ Variant[Undef,String] $from = undef, Variant[Undef,String] $repository = undef, - Variant[String] $repository_tag = 'latest', + Variant[Undef,String] $repository_tag = undef, Boolean $run = true, Boolean $create = false, @@ -48,11 +48,15 @@ $settings = $tp_settings + $settings_hash $real_repository = $repository ? { - undef => "${app}-${os}${osversion}", + undef => $app, default => $repository, } + $real_repository_tag = $repository_tag ? { + undef => "${os}-${osversion}", + default => $repository_tag, + } $real_from = $from ? { - undef => $os, + undef => "${os}:${osversion}", default => $from, } $real_path = "${workdir}/${os}/${osversion}/${app}/Dockerfile" @@ -79,7 +83,7 @@ ensure => directory, } } - + file { "${workdir}/${os}/${osversion}/${app}/Dockerfile": ensure => $ensure, content => template($template), @@ -88,21 +92,23 @@ # Image build if $build and $ensure == 'present' { - exec { "docker build ${build_options} -t ${username}/${real_repository}:${repository_tag} .": + exec { "docker build ${build_options} -t ${username}/${real_repository}:${real_repository_tag} .": cwd => "${workdir}/${os}/${osversion}/${app}", - path => '/bin:/usr/bin:/sbin:/usr/sbin', + path => '/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin', subscribe => File["${workdir}/${os}/${osversion}/${app}/Dockerfile"], refreshonly => true, + timeout => 0, } } # Image upload to Docker Hub if $push and $ensure == 'present' { - exec { "docker push ${username}/${real_repository}:${repository_tag}": + exec { "docker push ${username}/${real_repository}:${real_repository_tag}": cwd => "${workdir}/${os}/${osversion}/${app}", - path => '/bin:/usr/bin:/sbin:/usr/sbin', + path => '/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin', subscribe => Exec["docker build ${build_options} -t ${username}/${real_repository}:${repository_tag} ."], refreshonly => true, + timeout => 0, } } diff --git a/templates/dockerize/Dockerfile.erb b/templates/dockerize/Dockerfile.erb index 4f21a73..c596c68 100644 --- a/templates/dockerize/Dockerfile.erb +++ b/templates/dockerize/Dockerfile.erb @@ -23,10 +23,13 @@ RUN yum install -y <%= @settings['package_name'] %> && yum clean all <% if @settings['tcp_port'] -%> EXPOSE <%= @settings['tcp_port'] %> <% end -%> -<% if @settings['data_dir'] and @mount_data_dir -%> -VOLUME <%= @settings['data_dir'] %> +<% if @settings['data_dir_path'] and @mount_data_dir -%> +VOLUME <%= @settings['data_dir_path'] %> <% end -%> -<% if @settings['log_dir'] and @mount_log_dir -%> -VOLUME <%= @settings['log_dir'] %> +<% if @settings['log_dir_path'] and @mount_log_dir -%> +VOLUME <%= @settings['log_dir_path'] %> +<% end -%> +ENTRYPOINT [ "<%= @settings['process_name'] %>"<% if @settings['process_extra_name'] -%> , "<%= @settings['process_extra_name'] -%>"<% end -%> ] +<% if @settings['process_args'] -%> +CMD [ <% @settings['process_args'].each do |ar| %>"<%= ar %>",<% end -%> ] <% end -%> - From ea3679accd2ef510c6c9558b6749cd46534fc511 Mon Sep 17 00:00:00 2001 From: Alessandro Franceschi Date: Mon, 28 Mar 2016 23:58:06 +0200 Subject: [PATCH 3/6] Fixing autorepo with mirrorlist on tp::install --- manifests/install.pp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/manifests/install.pp b/manifests/install.pp index 0e2703d..98c4179 100644 --- a/manifests/install.pp +++ b/manifests/install.pp @@ -122,7 +122,8 @@ # Automatic repo management if $auto_repo == true - and $settings[repo_url] { + and $settings[repo_url] + or $settings[yum_mirrorlist] { $repo_enabled = $ensure ? { 'absent' => false, false => false, From 932156b756979cc4e0fe24713a4b869fa616c976 Mon Sep 17 00:00:00 2001 From: Alessandro Franceschi Date: Tue, 29 Mar 2016 16:05:51 +0200 Subject: [PATCH 4/6] Refining dockerfile template --- manifests/dockerize.pp | 45 +++++++++--------------------- templates/dockerize/Dockerfile.erb | 3 +- 2 files changed, 15 insertions(+), 33 deletions(-) diff --git a/manifests/dockerize.pp b/manifests/dockerize.pp index 7f28207..d9f1fb3 100644 --- a/manifests/dockerize.pp +++ b/manifests/dockerize.pp @@ -59,32 +59,19 @@ undef => "${os}:${osversion}", default => $from, } - $real_path = "${workdir}/${os}/${osversion}/${app}/Dockerfile" + $basedir_path = "${workdir}/${username}/${os}/${osversion}/${app}" + Exec { + path => '/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin', + timeout => 3000, + } + # Dockerfile creation if $create { - if ! defined(File[$workdir]) { - file { $workdir: - ensure => directory, - } - } - if ! defined(File["${workdir}/${os}"]) { - file { "${workdir}/${os}": - ensure => directory, - } - } - if ! defined(File["${workdir}/${os}/${osversion}"]) { - file { "${workdir}/${os}/${osversion}": - ensure => directory, - } - } - if ! defined(File["${workdir}/${os}/${osversion}/${app}"]) { - file { "${workdir}/${os}/${osversion}/${app}": - ensure => directory, - } - } - - file { "${workdir}/${os}/${osversion}/${app}/Dockerfile": + exec { "mkdir -p ${basedir_path}": + creates => $basedir_path, + } -> + file { "${basedir_path}/Dockerfile": ensure => $ensure, content => template($template), } @@ -93,22 +80,16 @@ # Image build if $build and $ensure == 'present' { exec { "docker build ${build_options} -t ${username}/${real_repository}:${real_repository_tag} .": - cwd => "${workdir}/${os}/${osversion}/${app}", - path => '/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin', - subscribe => File["${workdir}/${os}/${osversion}/${app}/Dockerfile"], - refreshonly => true, - timeout => 0, + cwd => $basedir_path, + subscribe => File["${basedir_path}/Dockerfile"], } } # Image upload to Docker Hub if $push and $ensure == 'present' { exec { "docker push ${username}/${real_repository}:${real_repository_tag}": - cwd => "${workdir}/${os}/${osversion}/${app}", - path => '/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin', + cwd => $basedir_path, subscribe => Exec["docker build ${build_options} -t ${username}/${real_repository}:${repository_tag} ."], - refreshonly => true, - timeout => 0, } } diff --git a/templates/dockerize/Dockerfile.erb b/templates/dockerize/Dockerfile.erb index c596c68..1c7b9d5 100644 --- a/templates/dockerize/Dockerfile.erb +++ b/templates/dockerize/Dockerfile.erb @@ -18,6 +18,7 @@ RUN apt-get update && \ <% if @settings['repo_url'] -%> RUN echo "[<%= @app %>]\nname=<%= @app %> repository\nbaseurl=<%= @settings['repo_url'] -%> > /etc/yum.repos.d/<%= @app %>.repo <% end -%> +RUN yum install -y epel-release RUN yum install -y <%= @settings['package_name'] %> && yum clean all <% end -%> <% if @settings['tcp_port'] -%> @@ -31,5 +32,5 @@ VOLUME <%= @settings['log_dir_path'] %> <% end -%> ENTRYPOINT [ "<%= @settings['process_name'] %>"<% if @settings['process_extra_name'] -%> , "<%= @settings['process_extra_name'] -%>"<% end -%> ] <% if @settings['process_args'] -%> -CMD [ <% @settings['process_args'].each do |ar| %>"<%= ar %>",<% end -%> ] +CMD [ <% comma = '' %><% @settings['process_args'].split.each do |ar| %><%= comma %>"<%= ar %>"<% comma = ',' %><% end -%> ] <% end -%> From 406ef16c712f5ec3fbace96210ac87e01665efae Mon Sep 17 00:00:00 2001 From: Alessandro Franceschi Date: Wed, 30 Mar 2016 12:42:01 +0200 Subject: [PATCH 5/6] Added exec_environment variable in tp::dockerize --- manifests/dockerize.pp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/manifests/dockerize.pp b/manifests/dockerize.pp index d9f1fb3..c4cc77f 100644 --- a/manifests/dockerize.pp +++ b/manifests/dockerize.pp @@ -31,6 +31,8 @@ Boolean $build = false, Boolean $push = false, + Variant[Undef,Array] $exec_environment = undef, + String $build_options = '', Boolean $mount_data_dir = true, @@ -65,7 +67,7 @@ path => '/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin', timeout => 3000, } - + # Dockerfile creation if $create { exec { "mkdir -p ${basedir_path}": @@ -82,14 +84,15 @@ exec { "docker build ${build_options} -t ${username}/${real_repository}:${real_repository_tag} .": cwd => $basedir_path, subscribe => File["${basedir_path}/Dockerfile"], + environment => $exec_environment, } } # Image upload to Docker Hub if $push and $ensure == 'present' { exec { "docker push ${username}/${real_repository}:${real_repository_tag}": - cwd => $basedir_path, - subscribe => Exec["docker build ${build_options} -t ${username}/${real_repository}:${repository_tag} ."], + subscribe => Exec["docker build ${build_options} -t ${username}/${real_repository}:${real_repository_tag} ."], + environment => $exec_environment, } } @@ -105,6 +108,10 @@ false => false, default => $settings[service_enable], } + exec { "docker pull ${username}/${real_repository}:${real_repository_tag}": + unless => "docker images | grep ${username}/${real_repository} | grep ${real_repository_tag}", + environment => $exec_environment, + } file { "/etc/init/docker-${app}": ensure => $ensure, content => template($init_template), From f0a09883485f6a8642f5151462a8392ce98ee490 Mon Sep 17 00:00:00 2001 From: Alessandro Franceschi Date: Wed, 30 Mar 2016 17:40:32 +0200 Subject: [PATCH 6/6] Fixing travis errors --- spec/functions/tp_lookup_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/functions/tp_lookup_spec.rb b/spec/functions/tp_lookup_spec.rb index 72b5be1..a3975b0 100644 --- a/spec/functions/tp_lookup_spec.rb +++ b/spec/functions/tp_lookup_spec.rb @@ -10,7 +10,7 @@ end it "should raise a ParseError if there is less than 3 arguments" do - expect { scope.function_tp_lookup(["1","2"]) }.to( raise_error(Puppet::ParseError)) + expect { scope.function_tp_lookup(["1","2"]) }.to( raise_error(Puppet::DevError)) end context "with test params" do