diff --git a/lib/kamal/cli/base.rb b/lib/kamal/cli/base.rb index e648281ff..9ac7f4547 100644 --- a/lib/kamal/cli/base.rb +++ b/lib/kamal/cli/base.rb @@ -31,6 +31,7 @@ def initialize(*) private def load_envs + # TODO: How can we load envs from configs? Is necessary? if destination = options[:destination] Dotenv.load(".env.#{destination}", ".env") else diff --git a/lib/kamal/cli/main.rb b/lib/kamal/cli/main.rb index c86418482..2e7092bf5 100644 --- a/lib/kamal/cli/main.rb +++ b/lib/kamal/cli/main.rb @@ -172,6 +172,9 @@ def envify if destination = options[:destination] env_template_path = ".env.#{destination}.erb" env_path = ".env.#{destination}" + elsif envify_from_config = KAMAL.config.raw_config["envify"] + env_template_path = ".env.#{envify_from_config}.erb" + env_path = ".env.#{envify_from_config}" else env_template_path = ".env.erb" env_path = ".env" diff --git a/lib/kamal/commands/traefik.rb b/lib/kamal/commands/traefik.rb index 569c2c2ca..796131b36 100644 --- a/lib/kamal/commands/traefik.rb +++ b/lib/kamal/commands/traefik.rb @@ -73,7 +73,7 @@ def port def env Kamal::Configuration::Env.from_config \ - config: config.traefik.fetch("env", {}), + config: config.traefik, secrets_file: File.join(config.host_env_directory, "traefik", "traefik.env") end diff --git a/lib/kamal/configuration/accessory.rb b/lib/kamal/configuration/accessory.rb index 42b7754f2..b62808841 100644 --- a/lib/kamal/configuration/accessory.rb +++ b/lib/kamal/configuration/accessory.rb @@ -43,7 +43,7 @@ def label_args def env Kamal::Configuration::Env.from_config \ - config: specifics.fetch("env", {}), + config: specifics, secrets_file: File.join(config.host_env_directory, "accessories", "#{service_name}.env") end diff --git a/lib/kamal/configuration/env.rb b/lib/kamal/configuration/env.rb index a78338493..45d48e57d 100644 --- a/lib/kamal/configuration/env.rb +++ b/lib/kamal/configuration/env.rb @@ -1,18 +1,22 @@ class Kamal::Configuration::Env - attr_reader :secrets_keys, :clear, :secrets_file + attr_reader :secrets_keys, :clear, :secrets_file, :env_file delegate :argumentize, to: Kamal::Utils def self.from_config(config:, secrets_file: nil) - secrets_keys = config.fetch("secret", []) - clear = config.fetch("clear", config.key?("secret") || config.key?("tags") ? {} : config) + env_key_config = config.class == Kamal::Configuration ? config.env : config.fetch("env", {}) + secrets_keys = env_key_config.fetch("secret", []) + clear = env_key_config.fetch("clear", env_key_config.key?("secret") || env_key_config.key?("tags") ? {} : env_key_config) + # TODO: Support a wide env_file + env_file = config.class == Kamal::Configuration ? nil : config.fetch("env_file", nil) - new clear: clear, secrets_keys: secrets_keys, secrets_file: secrets_file + new clear: clear, secrets_keys: secrets_keys, secrets_file: secrets_file, env_file: env_file end - def initialize(clear:, secrets_keys:, secrets_file:) + def initialize(clear:, secrets_keys:, secrets_file:, env_file:) @clear = clear @secrets_keys = secrets_keys @secrets_file = secrets_file + @env_file = env_file end def args @@ -24,7 +28,13 @@ def secrets_io end def secrets - @secrets ||= secrets_keys.to_h { |key| [ key, ENV.fetch(key) ] } + # TODO: More than one @env_file + # TODO: Considerer a merge between env_file and env + if @env_file + Dotenv::Environment.new(@env_file) + else + secrets_keys.to_h { |key| [ key, ENV.fetch(key) ] } + end end def secrets_directory @@ -35,6 +45,7 @@ def merge(other) self.class.new \ clear: @clear.merge(other.clear), secrets_keys: @secrets_keys | other.secrets_keys, + env_file: @env_file ? @env_file : other.env_file, secrets_file: secrets_file end end diff --git a/lib/kamal/configuration/role.rb b/lib/kamal/configuration/role.rb index f0df59244..5566ce70e 100644 --- a/lib/kamal/configuration/role.rb +++ b/lib/kamal/configuration/role.rb @@ -239,13 +239,13 @@ def specializations end def specialized_env - Kamal::Configuration::Env.from_config config: specializations.fetch("env", {}) + Kamal::Configuration::Env.from_config config: specializations end # Secrets are stored in an array, which won't merge by default, so have to do it by hand. def base_env Kamal::Configuration::Env.from_config \ - config: config.env, + config: config, secrets_file: File.join(config.host_env_directory, "roles", "#{container_prefix}.env") end