Puppet Function: docker_run_flags

Defined in:
lib/puppet/parser/functions/docker_run_flags.rb
Function type:
Ruby 3.x API

Overview

docker_run_flags()Any

Transforms a hash into a string of docker flags

Returns:

  • (Any)


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/puppet/parser/functions/docker_run_flags.rb', line 20

newfunction(:docker_run_flags, type: :rvalue) do |args|
  opts = args[0] || {}
  flags = []

  flags << "-u #{call_function('docker::escape', [opts['username']])}" if opts['username']

  flags << "-h #{call_function('docker::escape', [opts['hostname']])}" if opts['hostname']

  flags << "--restart '#{opts['restart']}'" if opts['restart']

  if opts['net']
    if opts['net'].is_a? String
      flags << "--net #{call_function('docker::escape', [opts['net']])}"
    elsif opts['net'].is_a? Array
      flags += opts['net'].map { |item| ["--net #{call_function('docker::escape', [item])}"] }
    end
  end

  flags << "-m #{opts['memory_limit']}" if opts['memory_limit']

  cpusets = [opts['cpuset']].flatten.compact
  unless cpusets.empty?
    value = cpusets.join(',')
    flags << "--cpuset-cpus=#{value}"
  end

  flags << '-n false' if opts['disable_network']

  flags << '--privileged' if opts['privileged']

  flags << "--health-cmd='#{opts['health_check_cmd']}'" if opts['health_check_cmd'] && opts['health_check_cmd'].to_s != 'undef'

  flags << "--health-interval=#{opts['health_check_interval']}s" if opts['health_check_interval'] && opts['health_check_interval'].to_s != 'undef'

  flags << '-t' if opts['tty']

  flags << '--read-only=true' if opts['read_only']

  params_join_char = if opts['osfamily'] && opts['osfamily'].to_s != 'undef'
                       opts['osfamily'].casecmp('windows').zero? ? " `\n" : " \\\n"
                     else
                       " \\\n"
                     end

  multi_flags = ->(values, fmt) {
    filtered = [values].flatten.compact
    filtered.map { |val| (fmt + params_join_char) % call_function('docker::escape', [val]) }
  }

  [
    ['--dns %s',          'dns'],
    ['--dns-search %s',   'dns_search'],
    ['--expose=%s',       'expose'],
    ['--link %s',         'links'],
    ['--lxc-conf=%s',     'lxc_conf'],
    ['--volumes-from %s', 'volumes_from'],
    ['-e %s',             'env'],
    ['--env-file %s',     'env_file'],
    ['-p %s',             'ports'],
    ['-l %s',             'labels'],
    ['--add-host %s',     'hostentries'],
    ['-v %s',             'volumes'],
  ].each do |(format, key)|
    values    = opts[key]
    new_flags = multi_flags.call(values, format)
    flags.concat(new_flags)
  end

  opts['extra_params'].each do |param|
    flags << param
  end

  # Some software (inc systemd) will truncate very long lines using glibc's
  # max line length. Wrap options across multiple lines with '\' to avoid
  flags.flatten.join(params_join_char)
end