Class: Kamal::Configuration

Inherits:
Object
  • Object
show all
Defined in:
lib/kamal/configuration.rb

Defined Under Namespace

Classes: Accessory, Boot, Builder, Env, Role, Ssh, Sshkit, Volume

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(raw_config, destination: nil, version: nil, validate: true) ⇒ Configuration

Returns a new instance of Configuration.



41
42
43
44
45
46
# File 'lib/kamal/configuration.rb', line 41

def initialize(raw_config, destination: nil, version: nil, validate: true)
  @raw_config = ActiveSupport::InheritableOptions.new(raw_config)
  @destination = destination
  @declared_version = version
  valid? if validate
end

Instance Attribute Details

#destinationObject (readonly)

Returns the value of attribute destination.



12
13
14
# File 'lib/kamal/configuration.rb', line 12

def destination
  @destination
end

#raw_configObject (readonly)

Returns the value of attribute raw_config.



12
13
14
# File 'lib/kamal/configuration.rb', line 12

def raw_config
  @raw_config
end

Class Method Details

.create_from(config_file:, destination: nil, version: nil) ⇒ Object



15
16
17
18
19
# File 'lib/kamal/configuration.rb', line 15

def create_from(config_file:, destination: nil, version: nil)
  raw_config = load_config_files(config_file, *destination_config_file(config_file, destination))

  new raw_config, destination: destination, version: version
end

Instance Method Details

#abbreviated_versionObject



57
58
59
60
61
62
63
64
65
66
# File 'lib/kamal/configuration.rb', line 57

def abbreviated_version
  if version
    # Don't abbreviate <sha>_uncommitted_<etc>
    if version.include?("_")
      version
    else
      version[0...7]
    end
  end
end

#absolute_imageObject



126
127
128
# File 'lib/kamal/configuration.rb', line 126

def absolute_image
  "#{repository}:#{version}"
end

#accessoriesObject



81
82
83
# File 'lib/kamal/configuration.rb', line 81

def accessories
  @accessories ||= raw_config.accessories&.keys&.collect { |name| Kamal::Configuration::Accessory.new(name, config: self) } || []
end

#accessory(name) ⇒ Object



85
86
87
# File 'lib/kamal/configuration.rb', line 85

def accessory(name)
  accessories.detect { |a| a.name == name.to_s }
end

#all_hostsObject



90
91
92
# File 'lib/kamal/configuration.rb', line 90

def all_hosts
  (roles + accessories).flat_map(&:hosts).uniq
end

#allow_empty_roles?Boolean

Returns:

  • (Boolean)


106
107
108
# File 'lib/kamal/configuration.rb', line 106

def allow_empty_roles?
  raw_config.allow_empty_roles
end

#asset_pathObject



223
224
225
# File 'lib/kamal/configuration.rb', line 223

def asset_path
  raw_config.asset_path
end

#bootObject



169
170
171
# File 'lib/kamal/configuration.rb', line 169

def boot
  Kamal::Configuration::Boot.new(config: self)
end

#builderObject



173
174
175
# File 'lib/kamal/configuration.rb', line 173

def builder
  Kamal::Configuration::Builder.new(config: self)
end

#envObject



232
233
234
# File 'lib/kamal/configuration.rb', line 232

def env
  raw_config.env || {}
end

#env_tag(name) ⇒ Object



244
245
246
# File 'lib/kamal/configuration.rb', line 244

def env_tag(name)
  env_tags.detect { |t| t.name == name.to_s }
end

#env_tagsObject



236
237
238
239
240
241
242
# File 'lib/kamal/configuration.rb', line 236

def env_tags
  @env_tags ||= if (tags = raw_config.env["tags"])
    tags.collect { |name, config| Kamal::Configuration::Env::Tag.new(name, config: config) }
  else
    []
  end
end

#healthcheckObject



190
191
192
# File 'lib/kamal/configuration.rb', line 190

def healthcheck
  { "path" => "/up", "port" => 3000, "max_attempts" => 7, "cord" => "/tmp/kamal-cord", "log_lines" => 50 }.merge(raw_config.healthcheck || {})
end

#healthcheck_serviceObject



194
195
196
# File 'lib/kamal/configuration.rb', line 194

def healthcheck_service
  [ "healthcheck", service, destination ].compact.join("-")
end

#hooks_pathObject



219
220
221
# File 'lib/kamal/configuration.rb', line 219

def hooks_path
  raw_config.hooks_path || ".kamal/hooks"
end

#host_env_directoryObject



228
229
230
# File 'lib/kamal/configuration.rb', line 228

def host_env_directory
  File.join(run_directory, "env")
end

#latest_imageObject



130
131
132
# File 'lib/kamal/configuration.rb', line 130

def latest_image
  "#{repository}:#{latest_tag}"
end

#latest_tagObject



134
135
136
# File 'lib/kamal/configuration.rb', line 134

def latest_tag
  [ "latest", *destination ].join("-")
end

#logging_argsObject



159
160
161
162
163
164
165
166
# File 'lib/kamal/configuration.rb', line 159

def logging_args
  if logging.present?
    optionize({ "log-driver" => logging["driver"] }.compact) +
      argumentize("--log-opt", logging["options"])
  else
    argumentize("--log-opt", { "max-size" => "10m" })
  end
end

#minimum_versionObject



68
69
70
# File 'lib/kamal/configuration.rb', line 68

def minimum_version
  raw_config.minimum_version
end

#primary_hostObject



94
95
96
# File 'lib/kamal/configuration.rb', line 94

def primary_host
  primary_role&.primary_host
end

#primary_roleObject



102
103
104
# File 'lib/kamal/configuration.rb', line 102

def primary_role
  role(primary_role_name)
end

#primary_role_nameObject



98
99
100
# File 'lib/kamal/configuration.rb', line 98

def primary_role_name
  raw_config.primary_role || "web"
end

#readiness_delayObject



198
199
200
# File 'lib/kamal/configuration.rb', line 198

def readiness_delay
  raw_config.readiness_delay || 7
end

#repositoryObject



122
123
124
# File 'lib/kamal/configuration.rb', line 122

def repository
  [ raw_config.registry["server"], image ].compact.join("/")
end

#require_destination?Boolean

Returns:

  • (Boolean)


142
143
144
# File 'lib/kamal/configuration.rb', line 142

def require_destination?
  raw_config.require_destination
end

#retain_containersObject



146
147
148
# File 'lib/kamal/configuration.rb', line 146

def retain_containers
  raw_config.retain_containers || 5
end

#role(name) ⇒ Object



77
78
79
# File 'lib/kamal/configuration.rb', line 77

def role(name)
  roles.detect { |r| r.name == name.to_s }
end

#rolesObject



73
74
75
# File 'lib/kamal/configuration.rb', line 73

def roles
  @roles ||= role_names.collect { |role_name| Role.new(role_name, config: self) }
end

#run_directoryObject



207
208
209
# File 'lib/kamal/configuration.rb', line 207

def run_directory
  raw_config.run_directory || ".kamal"
end

#run_directory_as_docker_volumeObject



211
212
213
214
215
216
217
# File 'lib/kamal/configuration.rb', line 211

def run_directory_as_docker_volume
  if Pathname.new(run_directory).absolute?
    run_directory
  else
    File.join "$(pwd)", run_directory
  end
end

#run_idObject



202
203
204
# File 'lib/kamal/configuration.rb', line 202

def run_id
  @run_id ||= SecureRandom.hex(16)
end

#service_with_versionObject



138
139
140
# File 'lib/kamal/configuration.rb', line 138

def service_with_version
  "#{service}-#{version}"
end

#sshObject



181
182
183
# File 'lib/kamal/configuration.rb', line 181

def ssh
  Kamal::Configuration::Ssh.new(config: self)
end

#sshkitObject



185
186
187
# File 'lib/kamal/configuration.rb', line 185

def sshkit
  Kamal::Configuration::Sshkit.new(config: self)
end

#to_hObject



253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
# File 'lib/kamal/configuration.rb', line 253

def to_h
  {
    roles: role_names,
    hosts: all_hosts,
    primary_host: primary_host,
    version: version,
    repository: repository,
    absolute_image: absolute_image,
    service_with_version: service_with_version,
    volume_args: volume_args,
    ssh_options: ssh.to_h,
    sshkit: sshkit.to_h,
    builder: builder.to_h,
    accessories: raw_config.accessories,
    logging: logging_args,
    healthcheck: healthcheck
  }.compact
end

#traefikObject



177
178
179
# File 'lib/kamal/configuration.rb', line 177

def traefik
  raw_config.traefik || {}
end

#traefik_hostsObject



118
119
120
# File 'lib/kamal/configuration.rb', line 118

def traefik_hosts
  traefik_roles.flat_map(&:hosts).uniq
end

#traefik_role_namesObject



114
115
116
# File 'lib/kamal/configuration.rb', line 114

def traefik_role_names
  traefik_roles.flat_map(&:name)
end

#traefik_rolesObject



110
111
112
# File 'lib/kamal/configuration.rb', line 110

def traefik_roles
  roles.select(&:running_traefik?)
end

#valid?Boolean

Returns:

  • (Boolean)


249
250
251
# File 'lib/kamal/configuration.rb', line 249

def valid?
  ensure_destination_if_required && ensure_required_keys_present && ensure_valid_kamal_version && ensure_retain_containers_valid && ensure_valid_service_name
end

#versionObject



53
54
55
# File 'lib/kamal/configuration.rb', line 53

def version
  @declared_version.presence || ENV["VERSION"] || git_version
end

#version=(version) ⇒ Object



49
50
51
# File 'lib/kamal/configuration.rb', line 49

def version=(version)
  @declared_version = version
end

#volume_argsObject



151
152
153
154
155
156
157
# File 'lib/kamal/configuration.rb', line 151

def volume_args
  if raw_config.volumes.present?
    argumentize "--volume", raw_config.volumes
  else
    []
  end
end